所以,这是我用来学习 MySQL 基础知识的资源中的一个示例。这个例子尤其让我现在很困惑。该示例指出:找到所有具有三个或更多共同爱好的人。
在这个数据库中,有一个只有名字作为属性的Person表和一个只有各种爱好名称的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}。 寻求有关如何获得共同爱好的帮助。唯一想到的可能是子查询,但不确定具体如何去做。
最佳答案
这并不容易。你想找到至少有三个爱好的人对。为了找到这些,您必须查询 hobbies 表两次。你将每个人的爱好与其他人的相同爱好结合起来。然后,您按人对聚合以查看他们有多少个连接行(即相同的爱好)。
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;
您可以使用此结果访问人员表以获得其他数据。例如:
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;
关于MySQL 查询以查找具有三个或更多共同爱好的人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40969555/