2013-05-31 4 views
6

Ich versuche herauszufinden, wie Sie eine Abfrage für SQL Server schreiben, die verwendet wird, um übereinstimmende Freunde zu finden. Die Namen befinden sich in zwei Spalten in derselben Tabelle. Nur "akzeptierte" Freunde sollten zurückgegeben werden.SQL Server: freigegebene Elemente in 2 Spalten finden

Hier ist ein Beispiel für die Datenbankinformationen:

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 

In diesem Beispiel Jimmy Freunde mit John ist. Der gemeinsame Freund zwischen diesen beiden (und das gewünschte Ergebnis) ist Joey. Sally ist beiden auch gemeinsam, aber Jimmy hat sie noch nicht als Freundin akzeptiert.

+0

Haben Sie ein Beispiel, was Sie bereits versucht haben? – HABO

Antwort

0

Eine etwas weniger elegant aus, aber möglicherweise leistungsfähigere Lösung könnte sein:

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

Arbeitete das erste Mal! –

+0

Ihre Lösung scheint besser zu funktionieren. Vielen Dank! –

3

Versuchen mit dieser doppelten Selbst registrieren gegenseitige Freundschaft:

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' 

COMMON gemeinsamer Freund.

Verwandte SQL Fiddle

Hinweis: Ich bin diese Struktur nicht sicher, ist das beste, diese Art von Beziehung zu halten, müssen Sie Regeln über die gegenseitige Freundschaft, über Freundschaft Ablehnung, aber es sieht aus wie Sie wissen würde nichts über diese Infos. Kennen Sie nur Teilinformationen oder ist dies Ihr Speichersystem/Ihre Architektur?

+0

Diese Lösung ist schön und kompakt, aber wo gebe ich die beiden Namen an, um den gemeinsamen Freund zu finden? –

+0

@JohnVanHorn fügen AND-Klausel in der externen Wrapping-Abfrage den Wert des Parameters aus Ihrem Code oder einer SQL-Funktion übergeben –