2011-01-04 28 views
2

これを尋ねたり、定義する方法はよく分かりませんが、それは分かりません。MySQL:1つではなく他の多対多の関係を持つ行を列挙してください。

persons    person_id, first_name, last_name 
hobbies    hobby_id, name 
persons_hobbies  person_id, hobby_id 

私は2つのリストを作る必要があります。

は、私はこのような3つのテーブルを持っています。趣味AとBの両方を持っている人、趣味Aを持っているがBではない人。これらの2つの質問をどのように書くことができますか?参加することでこれを行う方法を理解できません。

趣味Aはid = 3、趣味Bはid = 7です。このような

答えて

6

何か作業をする必要があります:

-- Persons that have both hobby A and B 
select p.first_name,p.last_name 
from persons p 
inner join persons_hobbies ph1 on ph1.person_id = p.person_id and ph1.hobby_id = 3 
inner join persons_hobbies ph2 on ph2.person_id = p.person_id and ph2.hobby_id = 7; 

-- Persons that have hobby A but not B 
select p.first_name,p.last_name 
from persons p 
inner join persons_hobbies ph1 on ph1.person_id = p.person_id and ph1.hobby_id = 3 
left outer join persons_hobbies ph2 on ph2.person_id = p.person_id and ph2.hobby_id = 7 
where ph2.person_id is null; 
+0

私はIDを持っています、それについて申し訳ありません。今質問に例題を追加しました:) – Svish

+0

クール、私はIDを使用する私の答えを更新します。 –

+0

ありがとう!素敵な仕事をしているようだ。あなたは私の人生を救った、hehe。 – Svish

0

を私はあなたがサブクエリを使用する場合は、このタイプは理解しやすく、コードであることがわかりました。

SELECT * FROM Persons 
WHERE person_id IN (SELECT person_id FROM person_hobbies WHERE hobby_id ...) 

しかし、あなたが参加する必要がある場合 - アイクはそれを釘付け。

+0

私はこれらのテーブルのサイズがわからないので、かなり大きいと仮定するのが最も安全だと思います。その場合、OPはサブクエリよりもジョインを使ってパフォーマンスが向上する可能性があります。 –

関連する問題