2010-07-08 3 views
9

У меня есть таблица user и таблица complaint., соединяющий одну и ту же таблицу дважды на разных колонках

Таблица complaint имеет следующую структуру:

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

Все пользователи, как в жалобщиков и жалобы-арбитры расположены в таблице user.

Как написать запрос, чтобы показать имя пользователя для обоих столбцов?

Это дает мне одно:

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

, но я не знаю, как писать так как _by колонки показывают имена пользователей, а не идентификаторы.

ответ

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

Я предпочитаю это подзапросам, где это возможно, легко читаемым и эффективным. –

+0

Не будет ли это декартово произведение «жалобы» x 'A' x' B'? – NeverEndingQueue

+0

@NeverEndingQueue - нет, это не произойдет, потому что у каждого из JOINs есть условие – 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 

вступите снова используя псевдоним (тот, что пользователь, как user2 материал о)

0

Используйте этот запрос:

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

Я предпочитаю подзапросов, как я считаю, их легче понять ...

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; 

Подзапросы обычно переписываются оптимизатором запросов, если у вас есть проблемы с производительностью.

Смежные вопросы