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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:31:31