4

我有一张这样的桌子:

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

我想创建一个这样的表:

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

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

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

4

1 回答 1

4

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

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

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

第二个技巧是做 across 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

我没有反引号查询中的所有内容。count通常,在 SQL 中使用类似或group保留字的列是不好的做法。

于 2013-05-07T14:40:48.103 回答