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

GROUP BY搭配ORDER BY排序异常:无法按最新cdate字段排序

解决GROUP BY搭配ORDER BY cdate排序异常的问题

这问题我之前也碰到过!核心原因是你用GROUP BY vedio_files.sCat的时候,数据库默认会从每个sCat分组里随机挑一行返回——这时候你后续的ORDER BY vedio_files.cdate DESC其实是在给这些随机挑出来的行排序,自然不会按每组的最新创建日期来排列。

要解决这个问题,我们需要先确保每个sCat分组只保留最新创建的那一行,再进行排序。下面给你两种常用的解决方案:

方案1:用子查询获取每组最新日期后关联

先通过子查询拿到每个sCat对应的最新cdate,再把原表和这个结果关联,确保只获取每组的最新数据:

SELECT 
    vf.ID, vf.mCat, vf.sCat, vf.smalltitle, vc.Name, vc2.Name as subcat
FROM 
    vedio_files vf
INNER JOIN 
    vcategories vc ON vf.mCat = vc.ID
LEFT JOIN 
    vcategories vc2 ON vf.sCat = vc2.ID
INNER JOIN (
    -- 子查询:获取每个sCat的最新创建日期
    SELECT sCat, MAX(cdate) AS max_cdate
    FROM vedio_files
    GROUP BY sCat
) latest ON vf.sCat = latest.sCat AND vf.cdate = latest.max_cdate
ORDER BY 
    vf.cdate DESC
LIMIT 10;

方案2:用窗口函数(适用于MySQL 8+、PostgreSQL等支持窗口函数的数据库)

用ROW_NUMBER()窗口函数给每个sCat组内的行按cdate降序编号,然后筛选出编号为1的行(即每组最新的行):

SELECT 
    ID, mCat, sCat, smalltitle, Name, subcat
FROM (
    SELECT 
        vf.ID, vf.mCat, vf.sCat, vf.smalltitle, vc.Name, vc2.Name as subcat,
        -- 按sCat分组,组内按cdate降序编号,最新的行编号为1
        ROW_NUMBER() OVER (PARTITION BY vf.sCat ORDER BY vf.cdate DESC) AS rn
    FROM 
        vedio_files vf
    INNER JOIN 
        vcategories vc ON vf.mCat = vc.ID
    LEFT JOIN 
        vcategories vc2 ON vf.sCat = vc2.ID
) ranked
WHERE rn = 1 -- 只保留每组最新的行
ORDER BY cdate DESC
LIMIT 10;

额外提醒

如果你的数据库开启了ONLY_FULL_GROUP_BY模式(这是SQL标准要求的严格模式),你原来的SQL语句会直接报错——因为SELECT里的列要么在GROUP BY子句中,要么被聚合函数包裹。上面两种方案都符合SQL标准,不会出现这个问题。

内容的提问来源于stack exchange,提问作者Nimer Sulieman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:47:15