Mysql 需求实现案例

需求1:

目前我有一个表 law_plan, 里面有个字段是 law_user_id (对应t_user表的多个主键id以逗号分割) 如: ea5e4995-54cd-4776-abce-dfcd2e80422f,a5dae260-99a6-4927-87da-17de1ef292bf,
同时这个表里有另外一个字段 law_user_names, 对应着t_user表的 nickname, 目前这个字段为空, 需要批量给law_user_names赋值
-- 解决方案通用思路:
-- 1.拆分 law_user_id:将逗号分隔的用户ID拆分为多行(每行一个ID)。
-- 2.关联 t_user 表:通过拆分后的ID匹配用户名。
-- 3.聚合用户名:按表 law_plan 的主键分组,用逗号拼接用户名。
-- 4.更新 law_user_names 字段:将拼接结果写回表 law_plan

-- 先验证拆分和关联结果是否正确
SELECT
    law_plan.id,
    law_plan.law_user_id,
    GROUP_CONCAT(t.nickname ORDER BY j.userId SEPARATOR ',') AS userNames
FROM
    law_plan,
    -- 将 law_user_id 转为 JSON 数组并拆分
    JSON_TABLE(
            CONCAT('["', REPLACE(law_plan.law_user_id, ',', '","'), '"]'),
            '$[*]' COLUMNS (userId VARCHAR(50) PATH '$')
    ) AS j
        LEFT JOIN t_user t ON j.userId = t.id  -- 用 LEFT JOIN 保留无匹配的ID(显示NULL)
WHERE
    law_plan.law_user_id IS NOT NULL AND law_plan.law_user_id != ''  -- 排除空值
GROUP BY
    law_plan.id;
-- 确认后执行更新
UPDATE
    law_plan
        JOIN (
        -- 子查询:生成每个ID对应的用户名拼接结果
        SELECT
            law_plan.id,
            GROUP_CONCAT(t.nickname ORDER BY j.userId SEPARATOR ',') AS userNames
        FROM
            law_plan,
            JSON_TABLE(
                    CONCAT('["', REPLACE(law_plan.law_user_id, ',', '","'), '"]'),
                    '$[*]' COLUMNS (userId VARCHAR(50) PATH '$')
            ) AS j
                LEFT JOIN t_user t ON j.userId = t.id
        WHERE
            law_plan.law_user_id IS NOT NULL AND law_plan.law_user_id != ''
        GROUP BY
            law_plan.id
    ) AS sub ON law_plan.id = sub.id  -- 通过主键关联
SET
    law_plan.law_user_names = sub.userNames;  -- 更新目标字段
最后修改:2025 年 08 月 23 日
如果觉得我的文章对你有用,请点个赞吧!