mysql - 连接两个字段上的表

标签 mysql join

当涉及到 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?首先,在 tblMessagessender_idtblUsersuser_idrecipient_idtblMessagestblUsersuser_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/

相关文章:

php - 如何删除包含多个帖子的页面中的帖子? [MySql]

php - 将php嵌套数组插入mysql表

mysql - SQL 键、外键对于目的来说有点过于锁定

php - 摆脱 MYSQL 中的循环父/子

java - 使用 @ManyToMany 关联连接三个表

mysql - 加入 "greater than"为左表返回多行

连接 CTE 时 SQL Server 语法错误

mysql - 仅重复 MySQL 结果中 id 的列

mysql - 左连接查询未按计划进行

php - 对 last_insert_id 使用 where 子句