当涉及到 JOINING 表时,我总是感到困惑。
因此,我有一个名为 tblUsers
的存储用户详细信息的表,该表具有以下字段(为简单起见,我在此处仅包含发帖时的必填字段):
user_id
first_name
我还有另一个存储名为 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`
目前看来它正在工作。但这是实现我的目标的正确方法吗?还是 JOINing tables 会更好? tblMessages
可能会增长到大量行。如果我们要进行 JOIN,那么我们将进行 2 个 LEFT JOIN?首先,在 tblMessages
的 sender_id
和 tblUsers
的 user_id
和 recipient_id
上tblMessages
与 tblUsers
的 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`;
如有疑问,请在查询之前使用 EXPLAIN
来确定它将使用哪些索引以及它的效率。查看这些 sqlfiddles包含每个查询的 EXPLAIN
。
您可以阅读一些关于选择此查询而非您的查询的原因 here直接来自文档 here . EXPLAIN
也是一个有用的工具,可以帮助您了解瓶颈在哪里以及导致数据库性能问题的原因(这可能不会对其产生太大影响,但您始终可以做一些当您的数据库达到正常大小时进行性能测试。
关于mysql - 连接两个字段上的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30729161/