对于一个项目,我必须查找特定人员发送的所有消息。所以,假设我有这些表:
人
person_id | first_name | last_name
消息
message_id | sender_id | receiver_id | message
sender_id 和receiver_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;
然后我得到了正确的收件人名称,但没有得到正确的发件人名称。
最佳答案
您需要两个联接。这就是加入
!
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
。
关于mysql - 如何使用两个不同的 id 从不同的表中选择多个列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55775795/