2017-07-27 3 views
0

Ich versuche, die Zeilen, in denen user_from existiert als user_to in anderen Zeile/s, die später erstellt wurden.Wählen Sie die erste Zeile für jede Kombination aus

Diese Abfrage gibt mir die Zeilen.

SELECT A 
FROM db.table A 
LEFT JOIN db.table B 
ON A.user_to = B.user_from 
AND A.user_from = B.user_to 
AND A.createdAt < B.createdAt 
WHERE B.user_to IS NOT NULL AND B.user_from IS NOT NULL; 

Allerdings möchte ich für jede Kombination von user_to/user_from nur die erste Reihe bekommen.

z. Wenn es einige Zeilen wie sind:

user_to = 1, user_from = 2 
user_to = 2, user_from = 1 
user_to = 2, user_from = 1 
user_to = 1, user_from = 2 

möchte ich nur die erste erstellt eine (wie createdAt definiert) erhalten.

Ich habe versucht mit GROUP BY user_from, aber dies schließt alle anderen Kombinationen mit jedem user_from aus.

+0

Bitte benutzen Sie 'DISTINCT' für die Spalte wählen Werte –

Antwort

0

Es scheint, ich hatte die Anforderung früher missverstanden.

Unter der Annahme, keine zwei 'createdAt' Werte sind genau die gleichen, könnten Sie verwenden:

 select a.* from 
     A a 
     where NOT EXISTS (SELECT * 
          FROM A b 
          WHERE (
           (
           (a.to_ = b.from_ AND a.from_ = b.to_) 
           OR 
           (a.to_ = b.to_ AND a.from_ = b.from_ AND a.c <> b.c) 
          ) 
         AND 
         b.c < a.c 
         ) 
        ); 
+0

Möchten Sie min wählen müssen sowohl auf A und B in diesem Fall? –

+0

Ich denke A sollte reichen, da das OP nur einen Rekord will. – dev8080

+0

@Manolo Ich denke, es könnte funktionieren, wenn SELECT-Klausel die createdAt einer Tabelle enthält (entweder ein Stern, A. Stern oder eine Liste, die es enthält). – dev8080

0

Ich denke Verwenden DISTINCT in der SELECT Abfrage.

SELECT DISTINCT A 
FROM db.table A 
LEFT JOIN db.table B 
ON A.user_to = B.user_from 
AND A.user_from = B.user_to 
AND A.createdAt < B.createdAt 
WHERE B.user_to IS NOT NULL AND B.user_from IS NOT NULL; 
Verwandte Themen