2 Stimmen

Ringkampf mit SQL

Ich habe das in einer MySQL-Datenbank:

Tabelle Nachricht
    sender_id int
    recipient_id int
    erstellt datetime
    [Titel, Text, etc... ausgelassen]

Ist es möglich, aus diesem, in einer einzigen Abfrage, eine Liste aller Benutzer zu erhalten, die mit einem bestimmten Benutzer mit der ID N kommuniziert haben (d.h. N erscheint entweder in sender_id oder recipient_id), geordnet nach erstellt, einschließlich des neuesten Werts von erstellt, ohne Duplikate (keine Sender/Empfänger-Paare N, M und M, N)?

Ich bin mir ziemlich sicher, dass die Antwort Nein lautet, aber ich habe Schwierigkeiten, mich zu überzeugen. Nachmittägliche Geistestrunkenheit.

Wenn Nein, welche effiziente Alternative würden Sie empfehlen?


EDIT: Oh Mann, Stack Overflow ist in diesen Tagen sehr lebhaft. 8 Antworten, bevor mir auffällt, dass ich vergessen habe anzugeben, dass ich den aktuellsten Wert von erstellt zusammen mit der anderen Benutzer-ID in jeder Zeile haben möchte.

0voto

Stefan Steinegger Punkte 62197

Ich denke, dass dies Ihren Anforderungen am besten entspricht:

SELECT *
FROM user
WHERE 
  user_id in 
    (select recipient_id FROM message m where m.sender_id = X)
  OR user_id in
    (select sender_id FROM message m where m.recipient_id = X)
order by
  created DESC

Es gibt keine Duplikate, keine Unions und keine SQL-dialektspezifischen Dinge.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X