MySQL 查询以查找具有三个或更多共同爱好的人

标签 mysql

所以,这是我用来学习 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/

相关文章:

MYSQL 多重联接重复输出

MySQL 累积会计年度(带条件)

mysql - 如何计算开始时间和结束时间之间的时间差?

mysql - 一个简单的 SQL 查询不起作用,我不知道出了什么问题

来自循环的 php mysql 查询 - 确定哪些表行不在循环中

php - 计算 SQL 组中的行数

php - 将 SQL 语句转换为 Joomla 格式时遇到问题

php - 将站点从 Drupal 移动到原始 PHP ...错误 : Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

MySQL数据库转义错误;无法在 Windows 上导入它

python - 使用 MySQL 进行数据操作 - 连接和计数