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

标签 mysql sql

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

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/

相关文章:

SQL:查找所有 parent 与我相似的 child

PHP/MySQL 子查询返回多于 1 行

sql - 在 SQLite 中选择前 10 个计数

c++ - 从 C++ 控制台应用程序开始使用 SQL Express

php - 登录系统: $_POST ['username' ] and $_POST ['password' ] are always empty

c# - 如何修复 "Incorrect syntax near ' )'"。当查询中没有 ) 时

php - PHP上的Sql查询问题?

mysql - 在另一个帐户下获取mysql中正确的当前用户

mysql - 登录CakePHP后,每个用户帐户使用不同的数据库

.NET 的 MySQL 连接器 - 它真的成熟吗?