You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:41:45