[英]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.