2016-12-05 54 views
1

因此,這是一個來自我用來學習MySQL基礎知識的資源的示例。這個例子特別讓我目前非常難過。這個例子說明:找到所有有三種或更多愛好的人共同。MySQL查詢查找具有三個或更多共同興趣的人

在這個數據庫中,只有一個名稱爲atttribute的名字表和一個只有不同興趣名稱的Hobbies表。每個人至少有一個愛好,但他們當然可以有幾個。

對於我的這種嘗試,我只迄今爲止得到的越來越有三個或更多的愛好這樣

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

所以,要明確以什麼我要找的人,說人「約翰」有業餘愛好{A,B,C,D},另一個人「戴夫」有業餘愛好{A,C,D,E,F},那麼他們將分享愛好{A,C, d}。 尋求一些幫助我如何才能獲得共同的愛好。只有想到的事情可能是一個子查詢,但不知道如何去做。

回答

0

這並不容易。你想找到至少分享三種愛好的人對。爲了找到這些,你必須兩次查詢興趣表。你將每個人的愛好與每個人的愛好結合起來。然後你按人對聚合,看看他們有多少加入的行(即同樣的愛好)。

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;