I have a table likes
, Where ID1 likes ID2
ID1 ID2
1025 1101
1247 1468
1316 1304
1501 1934
1641 1468
1689 1709
1709 1689
1782 1709
1911 1247
1934 1501
so i am select those who like each other, that is example
1501 1934
1934 1501
But i want to select each pair only once, and i am not able to do it. Can anyone point me in the right direction ? its a part of a bigger query, but this par开发者_运维百科t i am not able to do.
Thanks
To get a distinct list of all reciprocated likes you can use
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)
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)
Fix the data:
SELECT ID1, ID2
FROM likes
WHERE ID1 < ID2
UNION
SELECT ID2 AS ID1, ID1 AS ID2
FROM likes
WHERE ID1 > ID2;
...then fix the leak by adding data integrity constraints to the table e.g.
CREATE TABLE likes
(
ID1 INTEGER NOT NULL,
ID2 INTEGER NOT NULL,
CHECK (ID1 < ID2),
UNIQUE (ID1, ID2)
);
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
精彩评论