MySQL中myclass表分组列赋值:每4人一组设置分组标识
解决myclass表按每4人一组赋值grouping列的方案
嘿,这个分组需求我帮你搞定了!核心思路是先给数据按id排序分配行号,再根据行号计算分组编号,最后拼接成你要的「数字+字母」格式(比如1A)。下面针对不同主流数据库给出具体的SQL实现:
通用思路拆解
- 第一步:按id排序,给每条记录分配一个从1开始的连续行号
- 第二步:通过行号计算分组:
(行号-1) // 4 + 1,这样前4条会得到1,接下来4条得到2,以此类推 - 第三步:把分组数字和字母"A"拼接,得到最终的分组标识
MySQL 8.0+ 版本(支持窗口函数)
用窗口函数ROW_NUMBER()来生成行号,逻辑清晰易维护:
UPDATE myclass m JOIN ( SELECT id, CONCAT(FLOOR((ROW_NUMBER() OVER (ORDER BY id) - 1) / 4) + 1, 'A') AS group_label FROM myclass ) t ON m.id = t.id SET m.grouping = t.group_label;
老版本MySQL(不支持窗口函数)
用用户变量来模拟行号生成:
SET @row_num = 0; UPDATE myclass SET grouping = CONCAT(FLOOR((@row_num := @row_num + 1 - 1)/4) + 1, 'A') ORDER BY id;
PostgreSQL 版本
用CTE(公共表表达式)先计算分组标识,再更新原表:
WITH ranked AS ( SELECT id, CONCAT(FLOOR((ROW_NUMBER() OVER (ORDER BY id) - 1) / 4) + 1, 'A') AS group_label FROM myclass ) UPDATE myclass m SET grouping = r.group_label FROM ranked r WHERE m.id = r.id;
SQL Server 版本
同样用CTE实现,语法和PostgreSQL略有差异:
WITH ranked AS ( SELECT id, CONCAT(FLOOR((ROW_NUMBER() OVER (ORDER BY id) - 1) / 4) + 1, 'A') AS group_label FROM myclass ) UPDATE m SET grouping = r.group_label FROM myclass m JOIN ranked r ON m.id = r.id;
执行完上面的SQL后,你的myclass表就会得到期望的结果:前4条是1A,接下来4条是2A,最后3条是3A,完全符合每4人一组的要求。
内容的提问来源于stack exchange,提问作者www.cahyonegoro.com
相关产品推荐
相关产品推荐

