如何在MySQL 5.7中为表分组行分配动态数字组ID
问题描述
现有如下结构的表(假设表名为your_table):
| Name | family | group | Age | id |
|---|---|---|---|---|
| test1 | test1 | gr_one | 23 | 1 |
| test2 | test2 | gr_one | 28 | 2 |
| test3 | test3 | gr_two | 24 | 3 |
| test4 | test4 | gr_three | 30 | 4 |
| test5 | test5 | gr_three | 35 | 5 |
需要编写MySQL 5.7查询语句,得到如下结果:
| group | dynamic_id |
|---|---|
| gr_one | 1 |
| gr_two | 2 |
| gr_three | 3 |
注:MySQL 5.7不支持窗口函数。
解决方案
由于MySQL 5.7无窗口函数支持,可通过用户自定义变量实现需求,以下是两种可行方案:
方案一:基于去重分组+变量递增
这种方式更高效,先提取唯一分组再生成编号:
SELECT `group`, @id := @id + 1 AS dynamic_id FROM (SELECT DISTINCT `group` FROM your_table ORDER BY `group`) AS unique_groups, (SELECT @id := 0) AS init_vars;
方案二:基于变量跟踪分组变化
通过变量记录上一个分组值,判断是否递增编号:
SELECT `group`, dynamic_id FROM ( SELECT `group`, @row_num := IF(@prev_group = `group`, @row_num, @row_num + 1) AS dynamic_id, @prev_group := `group` FROM your_table, (SELECT @row_num := 0, @prev_group := '') AS init_vars ORDER BY `group` ) AS temp GROUP BY `group`;
关键说明
group是MySQL关键字,必须用反引号`包裹,避免语法报错。- 两种方案都依赖用户变量的初始化,确保每次查询开始时变量从0起步。
内容的提问来源于stack exchange,提问作者Navid_pdp11
相关产品推荐
相关产品推荐

