繁体   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