Mysql 连接两个字段上的表

Mysql 连接两个字段上的表,mysql,join,Mysql,Join,当涉及到加入表格时,我总是感到困惑 因此,我有一个名为tblUsers的存储用户详细信息的表,其中包含以下字段(为了简单起见,我在发布时仅在此处包含所需字段): 我还有另一个存储消息的表,名为tblMessages: msg_id sender_id recipient_id msg_body 现在我要做的是获取所有消息,包括用户名。我尝试的是: SELECT `msg_id`, (SELECT `first_name` FROM `tblUsers` WHERE `tbl

当涉及到加入表格时,我总是感到困惑

因此,我有一个名为
tblUsers
的存储用户详细信息的表,其中包含以下字段(为了简单起见,我在发布时仅在此处包含所需字段):

我还有另一个存储消息的表,名为
tblMessages

msg_id
sender_id
recipient_id
msg_body
现在我要做的是获取所有消息,包括用户名。我尝试的是:

SELECT 
    `msg_id`, 
    (SELECT `first_name` FROM `tblUsers` WHERE `tblUsers`.`user_id` = `tblMessages`.`sender_id`) AS `sender_name`,
    (SELECT `first_name` FROM `tblUsers` WHERE `tblUsers`.`user_id` = `tblMessages`.`recipient_id`) AS `recipient_name`,
    `msg_body`
FROM `tblMessages`
目前似乎正在发挥作用。但这是实现我目标的正确途径吗?还是加入谈判会更好?
tblMessages
可能会增长到大量行。如果我们要做连接,那么我们要做两个左连接?首先,在
tblUsers
tblMessages的
sender\u id
tblUsers的
user\u id
tblMessages的
sender\u id
上,再次在
tblUsers的
user\u id
上。对吗


请告诉我您对我的方法的建议或更正。

这将是您最好的查询(它将运行一次查询,然后根据索引联接表):

如果有疑问,请在查询之前使用
EXPLAIN
,以确定它将使用哪些索引,以及效率如何。检查包含每个查询的
解释的


您可以直接从文档中了解选择此查询而不是您的查询的原因
EXPLAIN
也是一个有用的工具,可以帮助您了解瓶颈所在以及导致数据库性能问题的原因(这可能不会对其产生太大影响,但当数据库达到正常大小时,您始终可以执行一些性能测试。

您应该使用两个不同的别名(例如s和r)连接同一个表两次:

SELECT
  m.msg_id,
  m.sender_id,
  s.first_name,
  m.recipient_id,
  r.first_name,
  m.msg_body
FROM
  tblMessages AS m
  LEFT JOIN tblUsers AS s ON m.sender_id=s.user_id
  LEFT JOIN tblUsers AS r ON m.recipient_id=r.user_id

但是你的方法没有错,它是有效的,并且有适当的索引应该不会慢很多。

非常感谢你,特别是提到
解释
非常感谢。因为没有规定接受两个答案(如果有,我会选择两个答案作为接受),我给你一个放弃投票。
SELECT m.`msg_id`, su.`first_name` AS `sender_name`, ru.`first_name` AS `recipient_name`, m.`msg_body`
FROM `tblMessages` m
LEFT JOIN `tblUsers` su ON m.`sender_id` = su.`user_id`
LEFT JOIN `tblUsers` ru ON m.`recipient_id` = ru.`user_id`;
SELECT
  m.msg_id,
  m.sender_id,
  s.first_name,
  m.recipient_id,
  r.first_name,
  m.msg_body
FROM
  tblMessages AS m
  LEFT JOIN tblUsers AS s ON m.sender_id=s.user_id
  LEFT JOIN tblUsers AS r ON m.recipient_id=r.user_id