第二个表的SQL SELECT和COUNT

时间:2014-05-13 13:51:15

标签: mysql sql count group-by left-join

有两张桌子:

users
==========
id
name

notes
=========
id
user_id
note

用户可以有多个笔记。

我想做一个SQL查询,它可以让所有用户获得所有字段以及笔记数量。此外,我希望结果按笔记数量(desc)排序

我写了这篇文章,但我想知道它是否是解决这个问题的正确/最快方法:

SELECT u.*, count(n.id) as amountnotes FROM users AS u 
LEFT JOIN notes AS n ON u.id=n.user_id
GROUP BY u.id
ORDER BY amountnotes DESC

EXPLAIN给了我2个结果。 "使用临时;使用filesort"对用户和"使用where;使用连接缓冲区(Block Nested Loop)"在笔记

任何帮助表示感谢,谢谢。如果建议采用不同的方法,请解释为什么我能理解。

2 个答案:

答案 0 :(得分:3)

如果您想要COUNT,则可以使用子查询而不是连接来执行此操作,如下所示:

SELECT u.*
,      (SELECT COUNT(*) FROM notes WHERE notes.user_id=u.id) as amountnotes
FROM users u
ORDER BY amountnotes DESC

如果以JOIN方式执行此操作,则GROUP BY 应该列出user的所有列(尽管MySql是其中一个RDBMS系统不要求这样,将这样的SQL移植到其他供应商的数据库就会出问题。)

答案 1 :(得分:2)

您的查询将返回您指定的结果集,假设idusers表中的UNIQUE(或PRIMARY)KEY。你的查询看起来很适合MySQL。

最佳做法是列出要返回的表达式,而不是使用*;但你拥有的是有效的。

请注意,此查询将在MySQL中运行,但其他数据库将引发错误,因为SELECT列表中存在未包含在GROUP BY中的非聚合。

(您的查询不是获取指定结果集的唯一方法,有几种选择)。