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