2013-05-07 57 views
4

我有这样一个表:
如何分割,计数和插入两个表之间?

 
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命令可以实现这一点的指针将不胜感激。

回答

4

你可以在SQL中做到这一点,但它需要一些技巧。您可以通过执行提取列表的字符串的第n个元素

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这样的列是不好的做法。

+0

伟大的解决方案!我一块一块地尝试了解它,它工作,但我不得不使用'TRIM'方法。前有和没有'TRIM' http://sqlfiddle.com/#!2/3a0a6/12。 – Marcassin 2013-05-07 15:18:42

+0

这是一个非常好的解决方案,并且我注意到您对于不使用特殊字词作为列名的观点。我只是用它作为例子,但仍然是一个有效的观点。 – 2014-02-10 09:46:48