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(原始数据)
| ID | column1 | column2 |
|---|---|---|
| 1 | 苹果 | 红 |
| 1 | 苹果 | 绿 |
| 2 | 香蕉 | 黄 |
| 2 | 香蕉 | 青 |
| 2 | 香蕉 | 黑 |
After(查询结果)
| ID | column1 | column2 |
|---|---|---|
| 1 | 苹果 | 红 |
| NULL | 苹果 | 绿 |
| 2 | 香蕉 | 黄 |
| NULL | 香蕉 | 青 |
| NULL | 香蕉 | 黑 |
内容的提问来源于stack exchange,提问作者Jagdish693
相关产品推荐
相关产品推荐

