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

如何分组展示每组最新数据?DataTables分组查询未获最新结果求助

解决GROUP BY无法获取每组最新数据的问题

你遇到的问题特别典型——直接用GROUP BY category_id时,MySQL(默认非严格SQL模式下)只会返回每组的任意一条记录,而非你期望的最新那条。这是因为GROUP BY的核心是分组聚合,若不对非分组字段使用聚合函数,数据库无法确定要返回哪一行数据。

针对你的场景,要获取每个分类下的最新新闻,我们需要先定位每个category_id对应的最新记录标识(比如自增的最大id,或是最新的date时间戳),再关联回原表和分类表拿到完整数据。

方法1:基于自增ID获取最新记录(假设ID越大,数据越新)

如果你的news表id是自增主键,直接用最大ID来定位最新记录最稳妥:

SELECT 
    n.id,
    n.image,
    n.heading,
    n.description,
    n.date,
    n.category_id,
    c.category
FROM 
    news n
INNER JOIN 
    categories c ON n.category_id = c.id
INNER JOIN (
    -- 子查询:找出每个分类下的最大ID(即最新记录的ID)
    SELECT category_id, MAX(id) AS latest_id
    FROM news
    GROUP BY category_id
) latest ON n.id = latest.latest_id

方法2:基于时间戳获取最新记录(如果date字段记录了更新时间)

如果你的date字段是准确的发布/更新时间戳,用这个方法更贴合业务逻辑:

SELECT 
    n.id,
    n.image,
    n.heading,
    n.description,
    n.date,
    n.category_id,
    c.category
FROM 
    news n
INNER JOIN 
    categories c ON n.category_id = c.id
INNER JOIN (
    -- 子查询:找出每个分类下的最新时间戳
    SELECT category_id, MAX(date) AS latest_date
    FROM news
    GROUP BY category_id
) latest ON n.category_id = latest.category_id AND n.date = latest.latest_date

进阶:用窗口函数简化写法(MySQL 8.0+支持)

如果你的MySQL版本是8.0及以上,窗口函数会让逻辑更清晰,还能灵活调整排序规则:

SELECT 
    id,
    image,
    heading,
    description,
    date,
    category_id,
    category
FROM (
    SELECT 
        n.*,
        c.category,
        -- 按分类分组,按时间倒序给每条记录标记序号
        ROW_NUMBER() OVER (PARTITION BY n.category_id ORDER BY n.date DESC) AS row_num
    FROM news n
    INNER JOIN categories c ON n.category_id = c.id
) temp
WHERE row_num = 1 -- 只保留每组的第一条(最新记录)

这个方式不仅写法简洁,还能轻松应对复杂排序需求——比如想按date倒序、id倒序多重排序,直接修改ORDER BY的字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:18:42