You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:16:02