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

MySQL分组查询:按shop分组并展示size值最大的行

解决MySQL按shop分组取size最大行的问题

问题说明

现有MENU表数据:

id, shop, size
1,  1   , 3
2,  1   , 8
3,  2   , 5

需求:按shop分组,每组仅展示一行数据,同一shop存在多条记录时显示size值最大的行;若同一shop的多条记录size均为0,也仅显示一行。

之前尝试的左连接SQL语句存在问题,当size为0时会返回同一shop的多条记录,以下是几种正确的实现方式:

方法1:修正左连接语句

你的原语句错误在于WHERE b.size NULL的写法,且缺少size相同时的去重逻辑,修正后:

SELECT a.* 
FROM menu a                   
LEFT JOIN menu b            
ON a.shop = b.shop AND (a.size < b.size OR (a.size = b.size AND a.id > b.id))
WHERE b.id IS NULL

通过a.id > b.id确保当size相同时(比如全为0),只保留id最大的一行,保证每组仅一条数据。

方法2:使用窗口函数(MySQL 8.0+)

这种写法更直观,适合高版本MySQL:

SELECT id, shop, size
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY shop ORDER BY size DESC, id DESC) AS rn
    FROM menu
) t
WHERE rn = 1

通过ROW_NUMBER()按shop分组,先按size降序排序,size相同则按id降序,取每组的第一行,完美覆盖所有场景。

方法3:分组子查询(兼容低版本MySQL)

如果使用MySQL 8.0以下版本,可以用子查询实现:

SELECT a.*
FROM menu a
INNER JOIN (
    SELECT shop, MAX(size) AS max_size, MAX(id) AS max_id
    FROM menu
    GROUP BY shop
) b ON a.shop = b.shop AND (a.size = b.max_size OR (b.max_size = 0 AND a.id = b.max_id))

该语句先分组获取每个shop的最大size和最大id,再关联原表,确保size为0时只取id最大的行。

内容的提问来源于stack exchange,提问作者wuqn yqow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:15:38