2016-12-05 3 views
1

これは私がMySQLの基本を学ぶために使っているリソースの例です。この例では特に、今のところ私はかなり困惑しています。この例では、3つ以上の趣味が共通するすべての人物を検索します。MySQLクエリ3つ以上の趣味が共通する人を探す

このデータベースには、atttributeとして名前を持つPersonテーブルと、さまざまな趣味の名前しか持たないHobbiesテーブルがあります。それぞれの人は少なくとも1つの趣味を持っていますが、いくつかの趣味を持つことができます。この時の私の試みのため

、私は私が探しています何をするよう明確にすること、したがって、この

SELECT person_name, COUNT(*) AS num_hobbies FROM Person 
INNER JOIN Hobbies ON Person.id = Hobbies.id 
GROUP BY person_name HAVING COUNT(*) >= 3; 

などの3つの以上の趣味を持っている人々を得るよう、これまで得ている、と言います趣味は{A、C、D、E、F}であり、趣味は{A、C、D、E} D}。 どのように趣味を得ることができるかについての助けを募集しています。心に浮かぶのはおそらくサブクエリだけですが、それについてどうやって正確に行くのかはわかりません。

答えて

0

これは簡単ではありません。あなたは少なくとも3つの趣味を共有している人のペアを見つけたいと思っています。これらを見つけるには、hobbiesテーブルを2回クエリする必要があります。すべての人の趣味を他の人と同じように組み合わせます。次に、人のペアを集約して、参加している行(つまり、同じ趣味)の数を確認します。

select h1.person_id, h2.person_id 
from hobbies h1 
join hobbies h2 on h2.person_id > h1.person_id 
       and h2.hobby_id = h1.hobby_id 
group by h1.person_id, h2.person_id 
having count(*) > 3; 

この結果を使用して、追加のデータを取得するためにpersons表にアクセスできます。例:

select 
    p1.person_id, p1.first_name, p1.last_name, 
    p2.person_id, p2.first_name, p2.last_name 
from 
(
    select h1.person_id as p1_id, h2.person_id as p2_id 
    from hobbies h1 
    join hobbies h2 on h2.person_id > h1.person_id 
        and h2.hobby_id = h1.hobby_id 
    group by h1.person_id, h2.person_id 
    having count(*) > 3 
) matches 
join persons p1 on p1.person_id = matches.p1_id 
join persons p2 on p2.person_id = matches.p2_id; 
関連する問題