GROUP BY分组后仅显示单条组数据的原因及ORDER BY使用疑问
问题详情
原始数据
| first_name | age |
|---|---|
| john | 31 |
| john | 25 |
| betty | 28 |
执行的SQL语句
SELECT * FROM Customers GROUP BY first_name ORDER BY age
实际查询结果
| first_name | age |
|---|---|
| betty | 28 |
| john | 31 |
用户疑问与预期
分组后的john组仅显示一条数据?我的预期是保留所有数据,先按age排序john的两条记录,再显示betty的记录,预期结果如下:
| first_name | age |
|---|---|
| john | 25 |
| john | 31 |
| betty | 28 |
john组内部按age排序,john与betty之间无需排序,但实际结果却是每组仅一条数据并按age排序。
问题原因与解决方案
GROUP BY first_name的核心作用是按first_name分组聚合,它会把相同first_name的行合并为一组,最终每组仅返回一条记录(具体返回哪条由数据库规则决定,比如这里返回了john的31岁记录)——GROUP BY是用来做聚合统计(如计数、求和)的,不是用来分组排序并保留所有行的,这就是john组只剩一条数据的原因。
要实现你的需求,不需要用GROUP BY,直接用多字段排序的ORDER BY即可:
SELECT * FROM Customers ORDER BY first_name DESC, age ASC;
其中first_name DESC会让john排在betty前面(字母表中j比b靠后,降序则john优先),age ASC实现john组内按年龄从小到大排序。
如果需要更明确指定john在前的排序逻辑(比如不依赖字母顺序),可以用自定义排序函数(以MySQL为例):
SELECT * FROM Customers ORDER BY FIELD(first_name, 'john', 'betty'), age ASC;
内容的提问来源于stack exchange,提问作者Ujjawal
相关产品推荐
相关产品推荐

