簡體   English   中英

在沒有group_concat的情況下使用SQL計算字符串和分組依據中字符的出現

[英]Count occurrences of character in a string and Group By with SQL without 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;

我的服務器是一台共享服務器,我沒有權限(例如,SET GLOBAL)。

我想執行另一個請求,以在沒有group_concat_max_len的情況下獲得相同的結果,您有想法嗎?

我認為這將像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問題表明實際問題更加復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM