2011-10-14 26 views
6

Tôi có một bảng likes, đâu ID1 thích ID2Mutual cột bè, chọn một cặp chỉ một lần

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

vì vậy tôi chọn những người thích nhau, đó là ví dụ

1501 1934 
1934 1501 

Nhưng tôi muốn chọn mỗi cặp chỉ một lần, và tôi không thể làm điều đó. Ai đó có thể chỉ cho tôi phương hướng đúng không ? nó là một phần của một truy vấn lớn hơn, nhưng phần này tôi không thể làm được.

Cảm ơn

Trả lời

6

Để có được một danh sách riêng biệt số lượt thích đáp lại bạn có thể sử dụng

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

Giải pháp tốt. Tôi cũng có thể làm cho một nỗ lực để làm sạch bảng và gây ra chèn trong tương lai để luôn luôn làm cho ID1

+0

@TomH - Có. Tất nhiên là không có gì đảm bảo rằng vì A thích B ngược lại cũng đúng. –

+0

Cảm ơn rất nhiều, tôi đã phải modifiy nó một chút để phù hợp với giải pháp của tôi, nhưng điều này làm việc :) – 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 dữ liệu:

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

... sau đó sửa chữa rò rỉ bởi thêm ràng buộc toàn vẹn dữ liệu vào bảng ví dụ

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

Bạn đã quên một bước. Sửa ứng dụng để nó không bị lỗi mỗi khi nó cố chèn các ID vào các cột sai. –

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 
Các vấn đề liên quan