Eu tenho uma tabela como esta:
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 seqüência ocorre em cada uma das descrições.
Portanto, se eu quiser contar o número de vezes que o '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, apenas mysql.
CHAR_LENGTH()
vez deLENGTH()
usar caracteres multibyte.Respostas:
Isso deve fazer o truque:
fonte
LENGTH()
eCHAR_LENGTH()
enquanto dividido no mesmo byte / char de contagem. @nicogawendaundevalue
temvalue
nele, por isso deve ser contado. Se você deseja apenas contar palavras completas, talvez seja necessário procurar por "valor" ou melhorar algo mais complicado, como usar regex.LENGTH( REPLACE ( LOWER(description), "value", "") )
e verifique se "value" está sempre em minúsculas usando PHPstrtolower()
. PS: Essa solução acima me ajudou a criar meu próprio mecanismo de pesquisa e a ponderar os resultados pelo número de palavras no texto. Obrigado!ROUND
aqui é desnecessário. assuma uma cadeia de comprimentox
comn
ocorrências de'value
.LENGTH(description) - LENGTH( REPLACE ( description, "value", "") )
sempre lhe darán*length("value")
, mergulhando que pelo tamanho do valor sempre deixará um número inteiron
. Não há necessidade de terminarUma variação um pouco mais simples e eficaz da solução @yannis:
A diferença é que substituo a string "value" por uma string menor de 1 caractere ("1234" neste caso). Dessa forma, você não precisa dividir e arredondar para obter um valor inteiro.
Versão generalizada (funciona para todas as cordas da agulha):
fonte
tente isto:
Demonstração do SQL Fiddle
fonte
No SQL SERVER, esta é a resposta
Resultado
Eu não tenho o MySQL instalado, mas olhei para encontrar o equivalente de LEN é COMPRIMENTO enquanto REPLACE é o mesmo.
Portanto, a consulta equivalente no MySql deve ser
Por favor, deixe-me saber se funcionou para você no MySql também.
fonte
Aqui está uma função que fará isso.
fonte
Obrigado Yannis, sua solução funcionou para mim e aqui estou compartilhando a mesma solução para várias palavras-chave com pedido e limite.
fonte
Esta é a função mysql usando a técnica de espaço (testada com o mysql 5.0 + 5.5):
CREATE FUNCTION count_str( haystack TEXT, needle VARCHAR(32)) RETURNS INTEGER DETERMINISTIC RETURN LENGTH(haystack) - LENGTH( REPLACE ( haystack, needle, space(char_length(needle)-1)) );
fonte