如何在两个表之间进行拆分,计数和插入?

时间:2013-05-07 14:31:53

标签: mysql

我有一张这样的表:

GROUP             COUNT
tag1, tag2        23
tag1, tag2, tag3  12
tag2, tag3        10

我想创建一个这样的表:

TAG               COUNT
tag1              35
tag2              45
tag3              22

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

因此,非常感谢任何关于如何使用纯SQL命令实现此目的的指针。

1 个答案:

答案 0 :(得分:4)

您可以在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

我没有反驳查询中的所有内容。通常,对于countgroup之类的列来说,这是SQL中的保留字。