在两个字段上连接表

时间:2015-06-09 10:13:38

标签: mysql join

在加入表格时,我总是感到困惑。

所以,我有一个存储名为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_idtblMessages 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 }}。这是对的吗?

让我知道您对我的方法的建议或更正。

2 个答案:

答案 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,了解选择此查询的原因hereEXPLAIN也是一个有用的工具,可以帮助您了解您的瓶颈在哪里以及导致数据库性能问题的原因(这可能不会对它产生太大影响,但您可以随时进行一些性能测试您的数据库达到了健康的大小。

答案 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

但是你的方法没有错,它的工作原理和适当的索引不应该慢得多。

相关问题