如何使用两个不同的ID从不同的表中选择多个列?

时间:2019-04-20 17:01:40

标签: mysql sql

对于一个项目,我必须查找特定人员已发送的所有消息。所以,说我有这些表:

person_id | first_name | last_name 

消息

message_id | sender_id | receiver_id | message

sender_id和receive_id均引用person_id。我必须显示发件人的名字和姓氏,收件人的名字和姓氏以及消息。我在显示发件人姓名和收件人姓名时特别麻烦。

我已经尝试了各种搜索来解决我的问题,但似乎没有任何效果或与我的问题真正相关。我已经看到一些解决方案使用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 个答案:

答案 0 :(得分:2)

您需要两个联接。那就是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

答案 1 :(得分:0)

进行左连接,并使用persion表别名将其与senderid和receiver id结合使用

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

答案 2 :(得分:0)

只需使用内部联接

例如:

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

创建内部联接的最佳方法是在SSMS应用程序中使用edite查询。

相关问题