如何按日期排序同时聚合同group_uuid条目并按组首id排序?
实现按组聚合且按组内最小ID排序的查询
可以实现这个需求。核心思路是先为每个group_uuid计算出该组的最小id,以此作为组的排序依据,再将同一组的条目聚合在一起,组内按id(或日期)排序。
解决方案SQL
SELECT f.* FROM food f INNER JOIN ( SELECT group_uuid, MIN(id) AS min_group_id FROM food GROUP BY group_uuid ) group_min_ids ON f.group_uuid = group_min_ids.group_uuid ORDER BY group_min_ids.min_group_id ASC, f.id ASC;
逻辑说明
- 子查询
group_min_ids:为每个group_uuid计算出该组的最小id值(min_group_id),这个值决定了整个组的排序位置——最小id越小的组越靠前。 - 关联查询:将原表
food与子查询结果通过group_uuid关联,获取每条记录对应的组最小id。 - 排序规则:
- 首先按
min_group_id升序排列,确保group_uuid为6d37ca的组(最小id为1)排在最前,接着是d90ad2组(最小id为2),最后是03a7f3组(最小id为5)。 - 组内按
id升序排列,保证同组内的条目按创建顺序排列,符合你要求的Apple之后紧跟Orange、Cucumber之后紧跟Carrot的结果。
- 首先按
可选调整
如果希望组内按date排序而非id,只需将排序规则改为:
ORDER BY group_min_ids.min_group_id ASC, f.date ASC, f.id ASC;
在你的示例数据中,两种排序方式结果一致,若组内存在同日期不同id的情况,添加f.id ASC可保证排序的稳定性。
内容的提问来源于stack exchange,提问作者Connell McCarthy
相关产品推荐
相关产品推荐

