2013-05-07 20 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

相關問題