2011-10-14 11 views
6

Mam tabeli likes, gdzie ID1 lubi ID2Wzajemne kolumna Friend, wybierz parę tylko raz

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

więc jestem wybrać tych, którzy lubią się nawzajem, że jest przykładem

1501 1934 
1934 1501 

Ale Chcę wybrać każdą parę tylko raz i nie jestem w stanie tego zrobić. Czy ktoś może wskazać mi właściwy kierunek? jest to część większego zapytania, ale tej części nie mogę zrobić.

Dzięki

Odpowiedz

6

Aby uzyskać odrębną listę wszystkich odwzajemnianych pokroju można użyć

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

dobrym rozwiązaniem. Prawdopodobnie podjąłbym także próbę oczyszczenia stołu i spowodowania, by przyszłe inserty zawsze tworzyły ID1

+0

@ Tom - Tak. Nie ma oczywiście żadnej gwarancji, że ponieważ A lubi B, to również jest odwrotnie. –

+0

Wielkie dzięki, musiałem go trochę zmodyfikować, żeby pasowało do mojego rozwiązania, ale zadziałało :) – 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

Fix dane:

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

... potem naprawić przeciek przez dodawanie ograniczeń integralności danych do tabeli, np

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

Zapomniałeś kroku. Napraw aplikację tak, aby nie powodowała błędu za każdym razem, gdy próbuje wstawić identyfikatory do niewłaściwych kolumn. –

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