2010-07-08 8 views
9

J'ai une table user et une table complaint.joindre la même table deux fois sur des colonnes différentes

Le tableau complaint présente la structure suivante:

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

Tous les utilisateurs, à la fois les complaignants et plaintes résolveurs sont situés dans le tableau user.

Comment écrire une requête pour afficher le nom d'utilisateur des deux colonnes?

Cela me donne un:

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

mais je ne sais pas comment l'écrire afin que les deux _by colonnes les noms d'utilisateur plutôt que ID.

Répondre

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

Je préfère ceci aux sous-requêtes si possible, facilement lisible et efficace. –

+0

Cela ne fournirait-il pas un produit cartésien de 'plainte' x' A' x 'B'? – NeverEndingQueue

+0

@NeverEndingQueue - Non ce n'est pas le cas parce que chacune des JOINs a une condition – 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 

Joignez-vous à nouveau en utilisant un alias (thats ce que l'utilisateur comme substance user2 est sur le point)

0

Utilisez cette requête:

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

Je préfère les sous-requêtes que je trouve les plus faciles à comprendre ...

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; 

Les sous-requêtes sont généralement réécrites par l'optimiseur de requêtes, si vous avez des problèmes de performances.

Questions connexes