此问题已在此处有答案:
SQL query for finding pairs that share the same set of values(2个答案)
15小时前关门了。
我有以下表成员:
| ID|嗜好|
| --------------|--------------|
| 1|足球|
| 1|网球|
| 1|足球|
| 二|纸牌|
| 二|绘画|
| 三|网球|
| 三|足球|
| 四个|纸牌|
我想选择对成员只有当他们有完全相同的爱好(没有重复)。所以在上表中,我希望查询输出:
| ID1| ID2|
| --------------|--------------|
| 1|三|
我的查询:
SELECT m1.id as id1 , m2.id as id2
FROM members m1 inner join members m2
ON m1.id < m2.id
WHERE m1.hobby in (
SELECT distinct(m2.hobby)
)
GROUP BY id1,id2
但我得到:
| ID1| ID2|
| --------------|--------------|
| 1|三|
| 二|四个|
4条答案
按热度按时间wnvonmuf1#
这样做的一种方式是:
输出:
检查演示here。
9rnv2umw2#
你可以通过使用
GROUP_CONCAT
将id按爱好分组,然后使用SUBSTRING_INDEX
拆分连接的对来实现这一点:此查询将返回具有多个成员的爱好:
结果:
逗号分隔的对将在最终查询中转换为列:
结果:
Demo here
lqfhib0f3#
(you可以在udata中添加count(distinct hobby)over(partition by id)作为n,并在u1和u2之间的JOIN中添加n的条件,但MySQL还不支持count distinct over partition...)
6bc51xsx4#
一个简单的方法是使用字符串聚合。这个想法是建立一个列表的所有爱好的每个成员;然后,我们可以自连接结果以生成共享完全相同的列表的用户对。
请注意,在列表中对爱好进行 * 排序 * 是很重要的,这样它们就可以进行一致的比较。
| ID1| ID2|业余爱好|
| --------------|--------------|--------------|
| 1|三|足球、网球|
fiddle