当 MySQL 需要根据聚合的结果排序时,应该如何处理?

2020-05-20 18:05:12 +08:00
 superwhite

表 A ID NAME 表 B ID AID TIME //一条表 A 对应多条表 B 的记录,一对多 表 C ID AID TIME //一条表 A 对应多条表 B 的记录,一对多 表 D ID AID AGE //一条表 A 对应一条表 D 的记录,一对一

我现在预期的 SQL 为

select A.id,count(B.id) as bcount,count(c.id) as ccount,d.age from A join B Join C join D group by A.id order by bcount DESC limit 0,10;

想问下:group by 是必须的吗?根据聚合的结果排序有问题吗?

3240 次点击
所在节点    MySQL
4 条回复
allAboutDbmss
2020-05-20 18:55:07 +08:00
首先没怎么看懂你对 A B C D 的描述 (如果可以可以给一个 minimal 数据集 或者 画个图)

但是 group by A.id 是必须的, 不然`select A.id`会 SQL 编译错误
superwhite
2020-05-20 19:20:22 +08:00
@allAboutDbmss sorry,写的时候以为会换行
superwhite
2020-05-20 19:23:49 +08:00
是的,根据 only_full_group_by 的 sql mode,不加是会报错。我想知道,我这样的 ordey by 一个聚合后的字段是否合理
lihongming
2020-05-21 08:06:12 +08:00
建议了解一下 SQL 命令真正的执行顺序,并不是按书写顺序来的。

绝大多数数据库按以下顺序执行:

from (以及 join )
where
group by
having
select
order by
limit

上述命令,每一步都是基于上一步的结果再执行。所以你的 order by 必须有相应的列才能用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/673725

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX