我有下面这张桌子 成员:

ID hobby
1 Football
1 Tennis
1 Football
2 Cards
2 Painting
3 Tennis
3 Football
4 Cards

我只想 Select 成对的成员,如果他们有完全相同的爱好(没有重复). 因此,在上表中,我希望该查询输出:

id1 id2
1 3

我的疑问是:

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 3
2 4

推荐答案

实现这一点的一种方法是:

  • 计算每个ID有多少独特的爱好
  • self 加入,在不同的ID上捕捉匹配的爱好和爱好数量
  • 确保爱好数等于每个ID的匹配记录数
WITH cte AS (
    SELECT ID, 
           hobby,
           COUNT(hobby) OVER(PARTITION BY ID) AS cnt
    FROM tab 
    GROUP BY ID, 
             hobby
)
SELECT t1.ID AS id1, 
       t2.ID AS id2
FROM       cte t1
INNER JOIN cte t2
        ON t1.ID < t2.ID 
       AND t1.hobby = t2.hobby
       AND t1.cnt = t2.cnt
GROUP BY t1.ID, t2.ID, t1.cnt
HAVING COUNT(*) = t1.cnt

Output:

id1 id2
1 3

查看演示here.

Mysql相关问答推荐

优化使用ORDER BY加载耗时较长的MySQL请求

为分组记录MySQL取取值为TRUE的单行

使用MySQL工作台导出具有数据的数据库表并导入到其字段具有不同数据类型的同一表中

比较2个mysql json数据类型列

如何确保 SQL 记录的列不引用它自己的主键?

如何进行查询以在两个不同的列中搜索两个不同的数据字符串?

在 MYSQL 8 中的 JSON 字段上的 SELECT 中返回所有键及其数组项

Select 最高等级最多的部门名称

MySQL:从 n 个关系表中 Select 所有具有 MAX() 值的行

MySQL中的会话客户端是什么

如果在表中多次发现 a 列中的相同值,则排除所有行

MariaDB 下的慢速更新、删除和插入查询

此插页中的X是什么> X'3C2F756C3E'

如何在sql中挑出某些名称

将 mySQL 查询作为 cron 作业(job)运行?

#1146 - 表 'phpmyadmin.pma_recent' 不存在

由于在 MySQL 中使用保留字作为表名或列名导致的语法错误

用户 'User'@'%' 和 'User'@'localhost' 不一样吗?

SQL WHERE 列 = 一切

在 MySQL 中仅 Select 仅包含字母数字字符的行