MySQL使用变量实现分组标记:为myclass表按每4人设置grouping列值
用MySQL变量实现按固定行数分组标记
嘿,这个需求我熟!要给myclass表按id排序后每4人一组标记grouping列,用用户变量或者窗口函数都能搞定,我给你两种实用方案:
方案一:使用用户变量(兼容所有MySQL版本)
这种方法适配旧版MySQL,核心是用变量追踪行号,再通过行号计算分组:
先验证分组结果(推荐先看效果再更新)
先执行这条SELECT语句,确认分组逻辑完全符合预期:
SET @row_num = 0; SELECT id, name, CONCAT(FLOOR((@row_num := @row_num + 1 - 1)/4) + 1, 'A') AS grouping FROM myclass ORDER BY id;
执行更新操作
如果验证没问题,就运行UPDATE语句修改表数据:
SET @row_num = 0; UPDATE myclass SET grouping = CONCAT(FLOOR((@row_num := @row_num + 1 - 1)/4) + 1, 'A') ORDER BY id;
逻辑拆解
@row_num:用来逐行计数,每次执行时自动递增FLOOR((@row_num - 1)/4) + 1:分组的核心公式,把每4行归为一组:- 行1-4 → 计算后得到
1,拼接'A'就是1A - 行5-8 → 计算后得到
2,拼接'A'就是2A - 哪怕最后一组不足4行(比如你例子里的9-11),也会被归为
3A
- 行1-4 → 计算后得到
- 必须加
ORDER BY id:如果不指定排序,MySQL不会按id顺序处理行,分组就会彻底乱套!
方案二:使用窗口函数(MySQL 8.0+ 适用)
如果你用的是MySQL 8.0及以上版本,用窗口函数ROW_NUMBER()会更简洁,不用手动管理变量:
UPDATE myclass mc JOIN ( SELECT id, CONCAT(FLOOR((ROW_NUMBER() OVER(ORDER BY id) - 1)/4) + 1, 'A') AS group_val FROM myclass ) t ON mc.id = t.id SET mc.grouping = t.group_val;
这个方法先通过子查询用窗口函数生成每个id对应的分组值,再关联原表更新grouping列,逻辑和变量方案一致,但代码更清晰易读。
最终效果验证
执行完任意一种方案后,查询表数据就能得到你想要的结果:
id | name | grouping | ------------------------ 1 | abc | 1A | 2 | bca | 1A | 3 | sad | 1A | 4 | tyu | 1A | 5 | hjh | 2A | 6 | lpk | 2A | 7 | ass | 2A | 8 | drc | 2A | 9 | dfg | 3A | 10 | drt | 3A | 11 | dgf | 3A |
内容的提问来源于stack exchange,提问作者Cahyo Negoro
相关产品推荐
相关产品推荐

