计算字符串中字符的出现次数和使用不带group_concat的SQL的Group By

时间:2017-03-11 00:03:44

标签: mysql sql phpmyadmin

我尝试计算出现次数并在

之后添加分组

我的表:

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的情况下执行其他请求以获得相同的结果,您有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我认为这只是一个#a:target ~ .wrap #p1 { color: blue; } #a:target ~ .wrap #p2 { color: red; } #a:target ~ #p3 { color: green; } .ta-center { text-align: center; } .wrap { padding: 5% 12%; }

更简单
<div id="a"></div>

<div class="wrap">

  <h1 class="ta-center">CSS - Selector :target</h1>

  <a href="#a">Sets text in color</a> |
  <a href="#">Reset</a>

  <p id="p1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
  <p id="p2">Numquam quas suscipit ipsam asperiores similique blanditiis est  deleniti temporibus earum. Autem, nisi officiis atque! Libero ab error.</p>

</div>

<p id="p3">Numquam quas suscipit ipsam asperiores similique blanditiis est deleniti temporibus earum. Autem, nisi officiis atque! Libero ab error.</p>

如果输出连接文本,则只需要处理SUM()

请注意,这种计算文本中“hello”数量的方法要简单得多。它用字符串替换字符串一个字符更长,然后简单地取长度的差异。如果您的字符串是UTF-8编码,则应确保附加字符为1个字节,或者使用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()

编辑:

我还要注意,对于问题中的示例,聚合不是必需的,因此这就足够了:

CHAR_LENGTH()

然而,OP与LENGTH()的问题表明实际问题更复杂。