2011-10-14 33 views
6

我有一个表likes,凡ID1喜欢ID2共同的朋友列中,选择一对只有一次

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

,所以我选择那些谁喜欢对方,也就是例如

1501 1934 
1934 1501 

但我只想选择一对,而我无法做到这一点。任何人都可以将我指向正确的方向吗?它是一个更大的查询的一部分,但这部分我无法做到。

感谢

回答

6

要获得所有投桃报李喜欢的一个独特的列表,你可以使用

SELECT ID1, 
     ID2 
FROM likes L1 
WHERE ID1 > ID2 
     AND EXISTS(SELECT * 
        FROM likes L2 
        WHERE L1.ID1 = L2.ID2 
         AND L1.ID2 = L2.ID1) 
+0

好的解决方案。我也可能会尝试清理表格并导致将来的插入始终使ID1

+0

@TomH - 是的。当然不能保证,因为A喜欢B,相反也是如此。 –

+0

非常感谢,我不得不修改它以适应我的解决方案,但这工作:) – Pheonix

0
select 
    L1.ID1, L1.ID2 
from likes L1 
where exists 
    (select 1 
     from likes L2 
     where L1.ID1 = L2.ID2 and L1.ID2 = L2.ID1) 
0

修复数据:

SELECT ID1, ID2 
    FROM likes 
WHERE ID1 < ID2 
UNION 
SELECT ID2 AS ID1, ID1 AS ID2 
    FROM likes 
WHERE ID1 > ID2; 

...然后修复泄漏将数据完整性约束添加到表中

CREATE TABLE likes 
(
ID1 INTEGER NOT NULL, 
ID2 INTEGER NOT NULL, 
CHECK (ID1 < ID2), 
UNIQUE (ID1, ID2) 
); 
+0

你忘了一步。修复应用程序,以便每次尝试将ID插入错误的列时都不会出错。 –

0
SELECT L1.ID1, L1.ID2 FROM Likes L1, Likes L2 
WHERE L1.ID1=L2.ID2 AND L1.ID2=L2.ID1 AND L1.ID1>L1.ID2