Как выбрать несколько столбцов из другой таблицы, используя два разных идентификатора? - PullRequest
0 голосов
/ 20 апреля 2019

Для проекта мне нужно найти все сообщения, которые отправил конкретный человек. Итак, скажем, у меня есть эти таблицы:

человек

person_id | first_name | last_name 

сообщение

message_id | sender_id | receiver_id | message

И отправитель_идентификатор, и получатель_идентификатор ссылаются на персона Я должен отобразить имя и фамилию отправителя, имя и фамилию получателя и сообщение. У меня возникают проблемы с отображением имен отправителей и получателей.

Я пробовал различные варианты поиска моей проблемы, но, похоже, ничего не работает или не имеет отношения к моей проблеме. Я видел, как некоторые решения используют UNION, но я еще не узнал об этом в своем классе. Это то, что я до сих пор:

SELECT p.first_name AS "Sender First Name",
    p.last_name AS "Sender Last Name",
    p.first_name AS "Reciever First Name",
    p.last_name AS "Reciever Last Name",
    m.message_id AS "Message ID",
    m.message AS "Message",
    m.send_datetime AS "Message Timestamp"
FROM message m, person p
WHERE m.sender_id = 1
AND m.sender_id = p.person_id;

Это дает мне:

+-------------------+------------------+---------------------+--------------------+------------+--------------------------------------------+---------------------+
| Sender First Name | Sender Last Name | Reciever First Name | Reciever Last Name | Message ID | Message                                    | Message Timestamp   |
+-------------------+------------------+---------------------+--------------------+------------+--------------------------------------------+---------------------+
| Michael           | Phelps           | Michael             | Phelps             |          1 | Congrats on winning the 800m Freestyle!    | 2016-12-25 09:00:00 |
| Michael           | Phelps           | Michael             | Phelps             |          4 | Thanks!  You're the greatest sprinter ever | 2016-12-25 09:04:00 |
| Michael           | Phelps           | Michael             | Phelps             |          5 | Good luck on your race                     | 2016-12-25 09:05:00 |
+-------------------+------------------+---------------------+--------------------+------------+--------------------------------------------+---------------------+

Значит, имена отправителей верны, а имена получателей - нет. Если я изменю последнюю строку на

AND m.receiver_id = p.person_id;

тогда я получаю правильные имена получателей, но не правильные имена отправителей.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2019

Вам нужно два соединения. И это JOIN!

SELECT ps.first_name AS "Sender First Name",
       ps.last_name AS "Sender Last Name",
       pr.first_name AS "Receiver First Name",
       pr.last_name AS "Receiver Last Name",
       m.message_id AS "Message ID",
       m.message AS "Message",
       m.send_datetime AS "Message Timestamp"
FROM message m JOIN
     person ps
     ON m.sender_id = ps.person_id JOIN
     person pr
     ON m.receiver_id = pr.person_id
WHERE m.sender_id = 1;

Примечания:

  • Если вы изучаете SQL, вы должны , а не учиться использовать запятые в предложении FROM.
  • Всегда используйте правильный, явный синтаксис JOIN.
  • Обратите внимание, что в этом случае вам нужно использовать псевдонимы таблиц, потому что у вас есть таблица дважды в FROM.
  • Если любой из столбцов может быть NULL, используйте LEFT JOIN вместо JOIN.
0 голосов
/ 20 апреля 2019

Просто используйте внутреннее объединение

Например:

Select *
From table1 inner join table2 On tbale1.id=table2.id

Лучший способ создания внутреннего соединения - использование редактируемого запроса в приложении SSMS.

0 голосов
/ 20 апреля 2019

сделать левое соединение и использовать псевдоним таблицы персоны для соединения с идентификатором отправителя и получателя

p.first_name AS "Sender First Name",
p.last_name AS "Sender Last Name",
p2.first_name AS "Reciever First Name",
p2.last_name AS "Reciever Last Name",
m.message_id AS "Message ID",
m.message AS "Message",
m.send_datetime AS "Message Timestamp"
from message m left join
 person p 
on p.persionid=m.sender_id
left join person p2 on p2.persionid=m.receiver_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...