我一直在关注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。
答案 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)
您可以使用函数min
和max
来获取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
如果在存在对称对时只需要一对,请使用
select min(id1,id2) as minid,max(id1,id2) as maxid
from likes
group by min(id1,id2),max(id1,id2)
having count(*) > 1