Contar o número de ocorrências de uma string em um campo VARCHAR?

Eu tenho uma mesa assim:

TITLE | DESCRIPTION ------------------------------------------------ test1 | value blah blah value test2 | value test test3 | test test test test4 | valuevaluevaluevaluevalue 

Eu estou tentando descobrir como retornar o número de vezes que uma string ocorre em cada uma das DESCRIÇÃO.

Então, se eu quiser contar o número de vezes que ‘valor’ aparece, a instrução sql retornará isso:

 TITLE | DESCRIPTION | COUNT ------------------------------------------------------------ test1 | value blah blah value | 2 test2 | value test | 1 test3 | test test test | 0 test4 | valuevaluevaluevaluevalue | 5 

Há alguma maneira de fazer isso? Eu não quero usar php em tudo, apenas mysql.

   

Isso deve fazer o truque:

 SELECT title, description, ROUND ( ( LENGTH(description) - LENGTH( REPLACE ( description, "value", "") ) ) / LENGTH("value") ) AS count FROM 

tente isto:

  select TITLE, (length(DESCRIPTION )-length(replace(DESCRIPTION ,'value','')))/5 as COUNT FROM 

Demonstração do SQL Fiddle

No SQL SERVER, esta é a resposta

 Declare @t table(TITLE VARCHAR(100), DESCRIPTION VARCHAR(100)) INSERT INTO @t SELECT 'test1', 'value blah blah value' INSERT INTO @t SELECT 'test2','value test' INSERT INTO @t SELECT 'test3','test test test' INSERT INTO @t SELECT 'test4','valuevaluevaluevaluevalue' SELECT TITLE,DESCRIPTION,Count = (LEN(DESCRIPTION) - LEN(REPLACE(DESCRIPTION, 'value', '')))/LEN('value') FROM @t 

Resultado

 TITLE DESCRIPTION Count test1 value blah blah value 2 test2 value test 1 test3 test test test 0 test4 valuevaluevaluevaluevalue 5 

Eu não tenho a instalação do MySQL, mas goggled para descobrir que o equivalente de LEN é LENGTH enquanto REPLACE é o mesmo.

Portanto, a consulta equivalente no MySql deve ser

 SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count FROM  

Por favor, deixe-me saber se funcionou para você no MySQL também.

Uma variação um pouco mais simples e mais eficaz da solução @yannis:

 SELECT title, description, LENGTH(description) - LENGTH( REPLACE ( description, "value", "1234") ) AS count FROM 

A diferença é que eu substituo a string “value” por uma string mais curta de 1-char (“1234” neste caso). Dessa forma, você não precisa dividir e arredondar para obter um valor inteiro.

 SELECT id, jsondata, ROUND ( ( LENGTH(jsondata) - LENGTH( REPLACE ( jsondata, "sonal", "") ) ) / LENGTH("sonal") ) + ROUND ( ( LENGTH(jsondata) - LENGTH( REPLACE ( jsondata, "khunt", "") ) ) / LENGTH("khunt") ) AS count1 FROM test ORDER BY count1 DESC LIMIT 0, 2 

Obrigado Yannis, sua solução funcionou para mim e aqui estou compartilhando a mesma solução para várias palavras-chave com ordem e limite.

Aqui está uma function que fará isso.

 CREATE FUNCTION count_str(haystack TEXT, needle VARCHAR(32)) RETURNS INTEGER DETERMINISTIC BEGIN RETURN ROUND((CHAR_LENGTH(haystack) - CHAR_LENGTH(REPLACE(haystack, needle, ""))) / CHAR_LENGTH(needle)); END;