SQLite技术问询:如何查找Likes表中的互斥配对?
找出Likes表中的互斥双向配对
嘿,我来帮你搞定这个问题!你之前写的SQL为啥没成功呢?咱们先拆解一下:
select L.ID1,L.ID2 from Likes L where (L.ID1||L.ID2) = (L.ID2||L.ID1);
这条语句其实只会筛选出ID1和ID2完全相等的记录——毕竟只有当两个值一模一样时,正反拼接的字符串才会相等,这显然不是你要找的那种双向配对(比如(1689,1709)和(1709,1689))。
下面给你两种实用的解决方案,都能精准找出这类互斥配对,还能避免重复输出同一对:
方法一:自连接查询(最直观的方式)
通过让表自己和自己关联,直接匹配双向存在的记录,再通过ID大小过滤去重:
SELECT L1.ID1, L1.ID2 FROM Likes L1 JOIN Likes L2 ON L1.ID1 = L2.ID2 AND L1.ID2 = L2.ID1 WHERE L1.ID1 < L1.ID2;
逻辑说明:
JOIN Likes L2 ON ...:把Likes表当作两个独立的表(L1和L2),当L1的ID1等于L2的ID2,且L1的ID2等于L2的ID1时,就说明这是一对双向配对。WHERE L1.ID1 < L1.ID2:确保每对配对只输出一次(比如只会显示(1689,1709),不会重复显示(1709,1689))。
方法二:分组统计(用统一格式的配对字符串)
如果更倾向于用字符串拼接的思路,可以先把每个配对按固定顺序(小ID在前,大ID在后)整理,再统计出现次数,找出出现至少两次的配对:
SELECT CASE WHEN ID1 < ID2 THEN ID1 ELSE ID2 END AS ID_A, CASE WHEN ID1 < ID2 THEN ID2 ELSE ID1 END AS ID_B FROM Likes GROUP BY ID_A, ID_B HAVING COUNT(*) >= 2;
如果你的数据库支持LEAST和GREATEST函数(大部分主流数据库都支持),还能简化成:
SELECT LEAST(ID1, ID2) AS ID_A, GREATEST(ID1, ID2) AS ID_B FROM Likes GROUP BY ID_A, ID_B HAVING COUNT(*) >= 2;
逻辑说明:
- 不管原记录是(ID1,ID2)还是(ID2,ID1),都会被转换成小ID在前、大ID在后的统一格式(比如(1689,1709))。
- 分组后统计次数,次数>=2就说明这个配对在表中双向存在。
内容的提问来源于stack exchange,提问作者Amira
相关产品推荐
相关产品推荐

