在加入表格时,我总是感到困惑。
所以,我有一个存储名为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`
此刻似乎正在发挥作用。但这是实现目标的正确方法吗?或者加入表会更好吗? tblMessages
可能会增长到大量行。如果我们要进行JOIN,那么我们将进行2次LEFT JOIN?首先,sender_id
tblMessages
user_id
tblUsers
recipient_id
再tblMessages
user_id
tblUsers
{
id: 1,
f: {
"5": [
"1",
"7"
],
"7": [
"3",
"6"
]
}
}
http://localhost/resource/1?f[5][]=1&f[5][]=7&f[7][]=3&f[7][]=6
}}。这是对的吗?
让我知道您对我的方法的建议或更正。
答案 0 :(得分:1)
这将是您最好的查询(它将运行一次查询,然后在其索引上连接表):
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
也是一个有用的工具,可以帮助您了解您的瓶颈在哪里以及导致数据库性能问题的原因(这可能不会对它产生太大影响,但您可以随时进行一些性能测试您的数据库达到了健康的大小。
答案 1 :(得分:1)
你应该使用两个不同的别名来加入同一个表,例如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
但是你的方法没有错,它的工作原理和适当的索引不应该慢得多。