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

MySQL中重复ID仅在首行显示的实现方案咨询

实现仅在重复ID首行显示ID的MySQL查询方案

嗨,这个需求我做报表的时候常碰到,给你两种适配不同MySQL版本的实现方案,完美匹配你要的效果:

方案一:MySQL 8.0+ 用窗口函数(推荐)

从MySQL 8.0开始支持窗口函数,ROW_NUMBER()可以轻松帮我们标记每个ID组内的行序号,然后只保留第一行的ID,其余行置为NULL。

示例代码

SELECT
    CASE WHEN row_num = 1 THEN ID ELSE NULL END AS ID,
    -- 替换成你的其他业务列
    column1,
    column2,
    column3
FROM (
    SELECT
        ID,
        column1,
        column2,
        column3,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY 你的排序字段) AS row_num
    FROM 你的数据表名
) AS temp_result;

逻辑说明

  • PARTITION BY ID:把相同ID的行归为同一组
  • ORDER BY 你的排序字段:指定每组内的行顺序,确保你认定的「首行」排在第一位(比如按创建时间、主键ID排序)
  • 外层用CASE判断:当组内行号为1时显示ID,其余行显示NULL

方案二:MySQL 5.x 用用户变量兼容低版本

如果你的MySQL版本低于8.0,不支持窗口函数,可以用用户变量来实现相同效果:

示例代码

SELECT
    CASE WHEN @prev_id != ID THEN ID ELSE NULL END AS ID,
    column1,
    column2,
    column3,
    @prev_id := ID
FROM (
    SELECT ID, column1, column2, column3
    FROM 你的数据表名
    ORDER BY ID, 你的排序字段 -- 必须先按ID排序,保证同ID行连续
) AS temp_result,
(SELECT @prev_id := '') AS init_variable;

逻辑说明

  • 子查询先按ID和组内顺序排序,确保相同ID的行连续排列
  • 初始化用户变量@prev_id为空,每次对比当前行ID与上一行ID:不同则显示当前ID,相同则显示NULL
  • 最后更新@prev_id为当前行ID,供下一行对比使用

前后效果示例

Before(原始数据)

IDcolumn1column2
1苹果红
1苹果绿
2香蕉黄
2香蕉青
2香蕉黑

After(查询结果)

IDcolumn1column2
1苹果红
NULL苹果绿
2香蕉黄
NULL香蕉青
NULL香蕉黑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:12:29