【问题标题】:How to split, count and insert between two tables?如何在两个表之间拆分、计数和插入?
【发布时间】:2025-12-20 13:20:27
【问题描述】:

我有一张这样的桌子:

组数 标签1,标签2 23 标签1,标签2,标签3 12 标签2,标签3 10

我想创建一个这样的表:

标签计数 标签 1 35 标签2 45 标签3 22

基本上,我想拆分第一个表中的字符串,然后计算出现次数,然后插入到新表中。我发现在 MySQL 中拆分字符串越来越困难。我不介意将结果带到我的 PHP 中并在那里使用它,但是表有 32000 行大,并且由于某种原因,我的 PHP 进程进入了无限期的 SLEEP 模式。

因此,任何关于我如何使用纯 SQL 命令来实现这一点的指针将不胜感激。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以在 SQL 中执行此操作,但需要一些技巧。您可以通过执行以下操作提取列表中字符串的 nth 个元素:

    select reverse(substring_index(reverse(substring_index(list, ', ', n)), ',', 1))
    

    最里面的substring_index() 检索直到第n 个项目的所有内容。然后反转字符串并获得第一项。最后,再次反转以撤消另一个反转。

    第二个技巧是使用cross join 来引入数字列表。您的列表最多包含 3 个元素,因此列表中最多需要 3 个元素。示例查询通过使用union all 将数字组合在一起来做到这一点;你可能有某种数字表。

    最后一步是汇总数据并总结:

    select tag, SUM(count)
    from (select reverse(substring_index(reverse(substring_index(group, ', ', n.n)), ',', 1)) as tag, count
          from t cross join
               (select 1 as n union all select 2 union all select 3
               ) n
          where n.n <= 1+(length(GROUP) - length(replace(group, ',', '')))
         ) t
    group by tag
    

    我没有反引号查询中的所有内容。一般来说,在 SQL 中使用保留字 countgroup 这样的列是不好的做法。

    【讨论】:

    • 很好的解决方案!我一点一点地尝试理解,它有效,但我必须使用TRIM 方法。前有和没有TRIM sqlfiddle.com/#!2/3a0a6/12
    • 这是一个非常好的解决方案,我注意到您关于不使用特殊单词作为列名的观点。我只是将它用于示例,但仍然是一个有效的观点。