表格[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/