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

SQL按order_id分组统计时如何获取每组最新id对应数据

实现方案

你的原始SQL不符合标准SQL规范,非聚合列未放入GROUP BY子句,仅在低版本MySQL关闭ONLY_FULL_GROUP_BY配置时可执行,返回的首条记录本身就是不稳定的。你可以根据数据库版本选择以下两种方案实现需求:


方案1:支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等)

WITH group_stat AS (
    SELECT 
        *,
        COUNT(id) OVER (PARTITION BY order_id) AS `count`,
        ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY id DESC) AS rn
    FROM chat_notif 
    WHERE sent_to = 2
)
SELECT id, order_id, chat_id, sent_to, `count`
FROM group_stat
WHERE rn = 1;

逻辑说明:先用COUNT() OVER窗口函数按order_id分组计算每组总记录数,再用ROW_NUMBER()给同组记录按id倒序编号,取编号为1的就是每组id最大的最新记录。


方案2:兼容不支持窗口函数的数据库(如MySQL 5.x)

SELECT 
    c.*,
    g.`count`
FROM chat_notif c
INNER JOIN (
    SELECT 
        order_id,
        MAX(id) AS max_id,
        COUNT(id) AS `count`
    FROM chat_notif
    WHERE sent_to = 2
    GROUP BY order_id
) g ON c.order_id = g.order_id AND c.id = g.max_id
WHERE c.sent_to = 2;

逻辑说明:先在子查询中按order_id分组,提前算出每组的最大id和记录总数,再关联原表拿到最大id对应的完整行数据即可。


内容的提问来源于stack exchange,提问作者Bright Lantern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:01