MySQL:按venue分组展示并按最新modified时间排序的查询问题
解决方案
要实现同一餐厅的优惠记录聚合,同时满足整体按餐厅最新修改时间倒序、餐厅内优惠也按修改时间倒序的需求,核心是先按餐厅的最新时间排序,再锁定餐厅分组,最后按优惠自身的修改时间排序——不需要用GROUP BY(会丢失明细数据),而是通过排序规则结合子查询(如果需要基于优惠的最新时间定义餐厅的最新时间)来实现。
情况1:餐厅的最新修改时间以venues表自身的modified字段为准
如果venues表本身有记录餐厅最后修改时间的modified字段,直接关联两张表后按以下规则排序即可:
SELECT v.id AS venue_id, v.name AS venue_name, s.id AS special_id, s.content AS special_content, s.modified AS special_modified FROM venues v INNER JOIN specials s ON v.id = s.venue_id ORDER BY -- 先按餐厅自身的最新修改时间倒序,确保同餐厅的记录聚合在一起 v.modified DESC, -- 加上餐厅ID作为排序第二条件,避免不同餐厅修改时间相同时打乱分组 v.id, -- 最后按餐厅内的优惠修改时间倒序 s.modified DESC;
情况2:餐厅的最新修改时间以其下所有优惠的最新modified时间为准
如果餐厅的"最新修改时间"定义为该餐厅下所有优惠的最后修改时间,需要先通过子查询计算每个餐厅的最新优惠时间,再关联排序:
SELECT v.id AS venue_id, v.name AS venue_name, s.id AS special_id, s.content AS special_content, s.modified AS special_modified, venue_latest.max_special_modified AS venue_latest_modified FROM venues v INNER JOIN specials s ON v.id = s.venue_id -- 子查询获取每个餐厅的最新优惠修改时间 INNER JOIN ( SELECT venue_id, MAX(modified) AS max_special_modified FROM specials GROUP BY venue_id ) venue_latest ON v.id = venue_latest.venue_id ORDER BY -- 按餐厅的最新优惠时间倒序 venue_latest.max_special_modified DESC, -- 确保同餐厅记录聚合 v.id, -- 餐厅内优惠按修改时间倒序 s.modified DESC;
逻辑说明
- 排序规则的优先级是核心:先按餐厅级别的最新时间倒序,这样同一餐厅的所有优惠记录会被集中排列;
- 加入
v.id作为第二排序条件,是为了避免不同餐厅的最新时间完全相同时,同餐厅的记录被分散; - 最后按优惠自身的
modified倒序,实现餐厅内的优惠排序。
内容的提问来源于stack exchange,提问作者SamW
相关产品推荐
相关产品推荐

