有两张桌子:
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)"在笔记
任何帮助表示感谢,谢谢。如果建议采用不同的方法,请解释为什么我能理解。
答案 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)
您的查询将返回您指定的结果集,假设id
是users
表中的UNIQUE(或PRIMARY)KEY。你的查询看起来很适合MySQL。
最佳做法是列出要返回的表达式,而不是使用*
;但你拥有的是有效的。
请注意,此查询将在MySQL中运行,但其他数据库将引发错误,因为SELECT列表中存在未包含在GROUP BY中的非聚合。
(您的查询不是获取指定结果集的唯一方法,有几种选择)。