MySQL присоединиться к тому же полю - PullRequest
2 голосов
/ 07 января 2012

У меня есть две таблицы:

  1. сообщения - со следующей структурой

    ID
    sender_id
    receiver_id
    текст сообщения

  2. пользователей - со следующей структурой

    ID
    ник

Мне нужно объединить эти две таблицы, чтобы получить такой результат:

message_id, sender_nickname, receiver_nickname, message_text

sender_id всегда установлено. Проблема в том, что мне также нужны сообщения, где receiver_id равно 0, поэтому receiver_id не может быть найдено в таблице user.

Может ли кто-нибудь мне помочь?

Ответы [ 5 ]

2 голосов
/ 07 января 2012
select 
m.id,
u1.nickname as sender,
u2.nickname as receiver,
m.message_text
from messages as m
left join users as u1 on u1.id = m.sender_id
left join users as u2 on u2.id = m.receiver_id
1 голос
/ 07 января 2012
SELECT ...
FROM messages
INNER JOIN users AS senders ON senders.id = messages.sender_id
LEFT JOIN users AS receivers ON receivers.id = messages.receiver_id

И оставить столбец receive_id NULL вместо значения INT 0, когда данных нет.

1 голос
/ 07 января 2012

Может выглядеть так:

SELECT m.id AS message_id
      ,u1.nickname AS sender_nickname
      ,u2.nickname AS receiver_nickname
      ,m.message_text
FROM   messages m
LEFT   JOIN users u1 ON u1.id = m.sender_id
LEFT   JOIN users u2 ON u2.id = m.receiver_id

A LEFT [OUTER] JOIN гарантирует, что левая таблица не будет исключена, если правая таблица не имеет соответствующего значения.

0 голосов
/ 07 января 2012

Вы можете использовать в нем externaljoin

select 
m.id as message_id, us.nickname as sender_nickname, ur.nickname as receiver_nickname, m.message_text as message_text
from messages m join users us on us.id = m.sender_id
left outer join users ur.id = m.receiver_id
where m.id = <your message id>
0 голосов
/ 07 января 2012

Вы должны использовать левое внешнее соединение, когда присоединяете таблицу сообщений к пользовательской таблице на receive_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...