2017-03-11 39 views
1

我嘗試計數事件,並通過添加組後計數出現不GROUP_CONCAT

我的表:

id | book | chapter | text 
1 | 1 | 1 | 'hello hello world' 
2 | 1 | 2 | 'hello hello hello hello' 
3 | 1 | 3 | 'world' 
4 | 1 | 4 | 'hello test' 

我執行我的要求:

SELECT 
book, 
chapter, 
group_concat(text) as text,  
ROUND ( 
    (
     LENGTH(group_concat(text)) 
     - LENGTH(REPLACE (group_concat(text), "hello", "")) 
    )/LENGTH("hello")   
) AS 'count' 
FROM my_table 
WHERE book=43 
GROUP BY chapter, book 

我想這樣的結果:

book | chapter | count 
---------------------- 
    43 | 1 | 2 
    43 | 2 | 4 
    43 | 3 | 0 
    43 | 4 | 1 

它的工作!

但我必須重新定義一個變量group_concat_max_len有:

SET SESSION group_concat_max_len = 1000000; 

我的服務器是一個mutualized服務器,我沒有權限(設置全局,例如)。

我想執行另一個請求,在沒有group_concat_max_len的情況下得到相同的結果,你有什麼想法嗎?

回答

2

我認爲這將是隻是一個簡單SUM()

SELECT book, chapter, 
     SUM(LENGTH(REPLACE(text, 'hello', 'hellox')) - LENGTH(text)) as num_hellos 
FROM my_table 
WHERE book = 43 
GROUP BY chapter, book; 

你只需要處理GROUP_CONCAT()如果輸出級聯文本。

請注意,這種計算文本中「hello」數量的方法要簡單得多。它用一個字符串替換字符串長度,然後簡單地取長度差異。如果你的字符串是UTF-8編碼的,你應該確保附加字符是1個字節或者使用CHAR_LENGTH()而不是LENGTH()

編輯:

讓我也注意到,在討論的例子中,聚集是沒有必要的,所以這足以:

SELECT book, chapter, 
     (LENGTH(REPLACE(text, 'hello', 'hellox')) - LENGTH(text)) as num_hellos 
FROM my_table 
WHERE book = 43; 

然而,OP與group_concat_max_len問題表明實際問題更復雜。

+0

這是我會採取的方法,只是在個人的「文本」中計算出現的事件,然後做計數的聚合。 +10。 (我同意Gordon。對於一組字符串中的字符串計數的直接「計數」,不需要「GROUP_CONCAT」聚合。) – spencer7593

+0

@Gordon真棒!謝謝 !! –