2010-07-08 3 views
9

Ich habe eine user Tabelle und eine complaint Tabelle.Beitritt der gleichen Tabelle zweimal auf verschiedenen Spalten

Die complaint Tabelle hat die folgende Struktur:

[opened_by] [complaint_text] [closed_by] 
(user_id)   (text)   (user_id) 
(user_id)   (text)   (user_id) 
(user_id)   (text)   (user_id) 

Alle Benutzer, sowohl die complainers und Beschwerde-Resolvern in der Tabelle befinden user.

Wie schreibe ich eine Abfrage, um den Benutzernamen für beide Spalten anzuzeigen?

Das gibt mir ein:

SELECT user.username, complaint.complaint_text 
FROM complaint 
LEFT JOIN user ON user.user_id=complaint.opened_by 

aber ich weiß nicht, wie es zu schreiben, so dass beide _by Spalten zeigen Benutzernamen anstatt IDs.

Antwort

31
SELECT 
    complaint.complaint_text, 
    A.username, 
    B.username 
FROM 
    complaint 
    LEFT JOIN user A ON A.user_id=complaint.opened_by 
    LEFT JOIN user B ON B.user_id=complaint.closed_by 
+0

Ich bevorzuge dies zu Unterabfragen wo möglich, leicht lesbar und effizient. –

+0

Wäre dies nicht ein kartesisches Produkt von 'reklamation' x' A' x 'B'? – NeverEndingQueue

+0

@NeverEndingQueue - nein es wird nicht, weil jede der JOINs eine Bedingung haben – potatopeelings

0
SELECT user1.username AS opened_by_username, complaint.complaint_text, user2.username AS closed_by_username 
FROM user AS user1, complaint, user as user2 
WHERE user1.user_id = complaint.opened_by 
AND user2.user_id = complaint.closed_by 

es Mitglied werden wieder einen Alias ​​verwenden (das ist, was der Benutzer als benutzer2 Zeug über)

0

Verwenden Sie diese Abfrage:

SELECT opener.username as opened_by, complaint.complaint_text, closer.username as closed_by 
FROM complaint 
LEFT JOIN user as opener ON opener.user_id=complaint.opened_by 
LEFT JOIN user as closer ON closer.user_id=complaint.closed_by 
1

Ich bevorUnterAbfragen wie ich finde sie sind leichter zu verstehen ...

SELECT (SELECT name 
      FROM user 
      WHERE user_id = opened_by) AS opener, 
     (SELECT name 
      FROM user 
      WHERE user_id = closed_by) AS closer, 
     complaint_text 
    FROM complaint; 

Unterabfragen werden normalerweise vom Abfrageoptimierer neu geschrieben, wenn Sie Probleme mit der Leistung haben.

Verwandte Themen