2013-05-31 30 views
6

Tôi đang cố gắng tìm ra cách viết truy vấn cho SQL Server được sử dụng để so khớp bạn bè chung. Tên nằm trong hai cột trong cùng một bảng. Chỉ những người bạn "được chấp nhận" mới được trả lại.Máy chủ SQL: tìm các mục được chia sẻ trong 2 cột

Dưới đây là một ví dụ về thông tin cơ sở dữ liệu:

ID  Name_1  Name_2  Accepted 
===================================== 
1  Jimmy  John  1 
2  John  Joey  1 
3  Joey  Jimmy  1 
4  John  Sally  1 
5  Jimmy  Sally  0 

Trong ví dụ này Jimmy là bạn bè với John. Người bạn chia sẻ giữa hai (và kết quả mong muốn) là Joey. Sally cũng rất bình thường, nhưng Jimmy vẫn chưa chấp nhận cô ấy như một người bạn.

+0

Bạn có một ví dụ về những gì bạn đã thử chưa? – HABO

Trả lời

0

Một phần nào ít nhìn khá thanh lịch, nhưng giải pháp biểu diễn có thể nhiều hơn có thể là:

DECLARE @person1 VARCHAR(50) = 'Jimmy' 
DECLARE @person2 VARCHAR(50) = 'John' 

SELECT FriendsOfP1.Name as MutualFriend 
FROM (SELECT A.name_2 AS Name 
      FROM  friends A 
      WHERE  (A.name_1 = @person1) 
        AND Accepted = 1 
        AND name_2 <> @person2 
      UNION ALL 
      SELECT A.name_1 
      FROM  friends A 
      WHERE  (A.name_2 = @person1) 
        AND Accepted = 1 
        AND name_1 <> @person2) AS friendsOfP1 
INNER JOIN (SELECT A.name_2 AS Name 
      FROM friends A 
      WHERE (A.name_1 = @person2) 
        AND Accepted = 1 
        AND name_2 <> @person1 
      UNION ALL 
      SELECT A.name_1 
      FROM friends A 
      WHERE (A.name_2 = @person2) 
        AND Accepted = 1 
        AND name_1 <> @person1) AS FriendsOfP2 
ON  FriendsOfP1.Name = FriendsOfP2.Name 
+0

Làm việc lần đầu tiên! –

+0

giải pháp của bạn dường như hoạt động tốt hơn. Cảm ơn! –

3

Hãy thử với tự đôi này tham gia vì tình bạn lẫn nhau:

SELECT Friend_1, Friend_2, COMMON 
FROM 
(
SELECT f2.NAME_1 AS Friend_1 
     ,f1.NAME_2 AS Friend_2 
     ,f2.Name_2 AS COMMON 
FROM friends f1 
INNER JOIN friends f2 
ON f1.NAME_1 = f2.NAME_2 
WHERE f1.accepted = 1 AND f2.accepted = 1 
) T 
INNER JOIN FRIENDS F3 
ON (F3.Name_1 = Friend_1 AND F3.Name_2 = Friend_2) 
OR (F3.Name_2 = Friend_1 AND F3.Name_1 = Friend_2) 
WHERE F3.ACCEPTED <> 0 AND Friend_1 = 'John' AND Friend_2 = 'Jimmy' 

CHUNG là người bạn chung.

liên quan SQL Fiddle

Note: Tôi không chắc chắn cấu trúc này là tốt nhất để giữ loại này của mối quan hệ, bạn có quy định về tình bạn lẫn nhau, khoảng từ chối tình bạn nhưng có vẻ như bạn muốn biết không có gì về những infos này. Bạn có biết chỉ một phần thông tin hay đây là hệ thống/kiến ​​trúc lưu trữ của bạn?

+0

Giải pháp này rất đẹp và nhỏ gọn, nhưng tôi chỉ định hai tên để tìm người bạn chung cho ai? –

+0

@JohnVanHorn thêm mệnh đề AND vào truy vấn gói bên ngoài chuyển giá trị của tham số từ mã của bạn hoặc hàm SQL –

Các vấn đề liên quan