2010-07-08 34 views
9

Tengo una tabla user y una tabla complaint.unir la misma tabla dos veces en diferentes columnas

La tabla complaint tiene la siguiente estructura:

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

todos los usuarios, tanto los que se quejan y de queja-resolución de se encuentran en la tabla user.

¿Cómo escribo una consulta para mostrar el nombre de usuario de ambas columnas?

Esto me da una:

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

pero no sé cómo se escribe por lo tanto _by columnas muestran los nombres de usuario en lugar de identificadores.

Respuesta

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

Prefiero esto a sub-consultas donde sea posible, fácil de leer y eficiente. –

+0

¿No proporcionaría esto un producto cartesiano de 'queja' x' A' x' B'? – NeverEndingQueue

+0

@NeverEndingQueue - no, no lo hará porque cada una de las UNIONES tiene una condición – 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 

unirse a ella de nuevo usando un alias (eso es lo que el usuario como enseres usuario2 se trata)

0

Utilice esta consulta:

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

prefiero sub-consultas como encuentro son más fáciles de entender ...

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; 

Las subconsultas generalmente son reescritas por el optimizador de consultas, si tiene algún problema de rendimiento.

Cuestiones relacionadas