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

如何在MySQL中将tblregs表的逗号分隔数组字段LinkedIDs拆分为多行

MySQL拆分逗号分隔字段行转列实现方案

方案1:MySQL 8.0+ 递归CTE实现(无需依赖额外辅助表)

该方案无需提前创建辅助表,自动适配1个或多个逗号分隔值的拆分需求:

WITH RECURSIVE split_cte AS (
    SELECT 
        LinkedIDs AS original_ids,
        SUBSTRING_INDEX(LinkedIDs, ',', 1) AS LinkedIDs,
        Quan,
        1 AS pos
    FROM tblregs
    UNION ALL
    SELECT 
        original_ids,
        SUBSTRING_INDEX(SUBSTRING_INDEX(original_ids, ',', pos + 1), ',', -1) AS LinkedIDs,
        Quan,
        pos + 1 AS pos
    FROM split_cte
    WHERE pos < LENGTH(original_ids) - LENGTH(REPLACE(original_ids, ',', '')) + 1
)
SELECT LinkedIDs, Quan 
FROM split_cte
ORDER BY Quan DESC, LinkedIDs;

如果单个LinkedIDs字段内的分隔值超过1000个,可执行SET cte_max_recursion_depth = 10000;临时调整递归深度上限。

方案2:沿用原有numbers辅助表方案

你原有SQL逻辑正确,仅需修正字段别名,同时确保numbers表的n值覆盖单条LinkedIDs的最大分隔值数量即可,修正后代码如下:

SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(t.LinkedIDs, ',', n.n), ',', -1) AS LinkedIDs,
  t.Quan
FROM
  numbers n
INNER JOIN tblregs t
  ON CHAR_LENGTH(t.LinkedIDs) - CHAR_LENGTH(REPLACE(t.LinkedIDs, ',', '')) >= n.n - 1
ORDER BY t.Quan DESC, n.n;

如果还未创建numbers表,可执行以下语句生成连续数字表:

-- 创建numbers表
CREATE TABLE numbers (n INT PRIMARY KEY);
-- 插入1-100的连续整数,可根据实际需要的最大分隔值数量调整范围
INSERT INTO numbers (n)
SELECT a.N + b.N * 10 + 1
FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a,
     (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n;

内容的提问来源于stack exchange,提问作者M.J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:45:03