mysql - SQL问题。在一张 table 上找到两个有相同爱好的人

标签 mysql sql

表格[tbl_hobby]

person_id(int),hobby_id(int)

有很多记录。我想要一个 SQL 查询来查找具有相同爱好(相同 hobby_id )的所有 personid 对。

如果A有hobby_id 1,B也有,如果A没有hobby_id 2,B也没有,我们将输出A和B的person_ids。

如果 A、B 和 C 达到限制,我们输出 A & B 、B & C、A & C。

我用一种非常非常非常愚蠢的方法完成了,多次连接表本身和多个子查询。当然还被领导笑了。

SQL中有没有高性能的方法可以解决这个问题?

从36小时前开始我就一直在苦苦思考这个问题......


mysql转储中的示例数据

CREATE TABLE `tbl_hobby` (
  `person_id` int(11) NOT NULL,
  `hobby_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `tbl_hobby` (`person_id`, `hobby_id`) VALUES
(1, 1),(1, 2),(1, 3),(1, 4),(1, 5),(2, 2),
(2, 3),(2, 4),(3, 1),(3, 2),(3, 3),(3, 4),
(4, 1),(4, 3),(4, 4),(5, 1),(5, 5),(5, 9),
(6, 2),(6, 3),(6, 4),(7, 1),(7, 3),(7, 7),
(8, 2),(8, 3),(8, 4),(9, 1),(9, 2),(9, 3),
(9, 4),(10, 1),(10, 5),(10, 9),(10, 11);
COMMIT;

专家结果:(2和6和8相同,3和9相同)

2,6
2,8
6,8
3,9

结果记录的顺序和一条记录中两个数字的顺序并不重要。一列或两列的结果记录都被接受,因为它可以很容易地连接或分离。

最佳答案

汇总每个人以获得他们的爱好的字符串。然后汇总每个爱好列表,找出哪些爱好属于多个人。

select hobbies, group_concat(person_id order by person_id) as persons
from
(
  select person_id, group_concat(hobby_id order by hobby_id) as hobbies
  from tbl_hobby
  group by person_id
) persons
group by hobbies
having count(*) > 1
order by hobbies;

这给出了每个爱好的人员列表。这是输出解决方案的最简单方法,否则我们必须构建所有可能的对。

更新:如果您想要成对的,则必须查询该表两次:

select p1.person_id as person 1, p2.person_id as person2
from
(
  select person_id, group_concat(hobby_id order by hobby_id) as hobbies
  from tbl_hobby
  group by person_id
) p1
join
(
  select person_id, group_concat(hobby_id order by hobby_id) as hobbies
  from tbl_hobby
  group by person_id
) p2 on p2.person_id > p1.person_id and p2.hobbies = p1.hobbies
order by person1, person2;

关于mysql - SQL问题。在一张 table 上找到两个有相同爱好的人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52485673/

相关文章:

sql - PostgreSQL 通过 group by 获得相对平均值

sql - 将字段值连接到 SQL Server 中的字符串

android - mysql soap 调用在 android 设备上不起作用

mysql - ORDER BY 子句受另一个表中的子选择约束

mysql - 如何将多个 SQL 查询合并为一个

MYSQL 使用 Union 组合两个查询

mysql - 如何使用nodejs将本地sql文件转换为json

MySqlDataAdapter.update() 不使用 DataRelation 更新 DataRow

jquery - 如何在perl中加快从mysql加载图片的速度

mysql - 节点MYSQL请求,异步问题