使用SQLite从两列中获取唯一的对称对

时间:2017-05-16 12:08:19

标签: sql sqlite

我一直在关注Stack上的类似问题,但其中任何一个似乎对我有帮助。我有下表叫“喜欢”:

 ID1    ID2
1689    1709
1709    1689
1782    1709
1911    1247
1247    1468
1641    1468
1316    1304
1501    1934
1934    1501
1025    1101

我想获得两列ID1和ID2之间的唯一对。那就是:

 ID1    ID2
1689    1709
1501    1934

有什么想法吗? THX。

2 个答案:

答案 0 :(得分:5)

看起来你想要两个版本中存在的对,即(x,y)和(y,x)。

可以使用EXISTS查询完成:

select t1.c1, t1.c2
from tablename t1
where t1.c1 < t1.c2
  and exists (select 1 from tablename t2
              where t1.c1 = t2.c2
                and t1.c2 = t2.c1)

JOIN

select t1.c1, t1.c2
from tablename t1
join tablename t2
    on  t1.c1 = t2.c2
    and t1.c2 = t2.c1
where t1.c1 < t1.c2

答案 1 :(得分:3)

您可以使用函数minmax来获取id1,id2中最小和最大的函数,并查找对称对组合(a,b),(b,a)(a的计数)对&gt; 1)。然后将left join这个放到原始表上以获得一对这样的对。

select l.*
from likes l
left join (select min(id1,id2) as minid,max(id1,id2) as maxid 
           from likes
           group by min(id1,id2),max(id1,id2)
           having count(*) > 1) t on t.minid=l.id1 and t.maxid=l.id2
where t.minid is null and t.maxid is null

Sample Demo

如果在存在对称对时只需要一对,请使用

select min(id1,id2) as minid,max(id1,id2) as maxid 
from likes
group by min(id1,id2),max(id1,id2)
having count(*) > 1