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; -- 更新目标字段