Tengo una mesa como esta:
TITLE | DESCRIPTION
------------------------------------------------
test1 | value blah blah value
test2 | value test
test3 | test test test
test4 | valuevaluevaluevaluevalue
Estoy tratando de descubrir cómo devolver la cantidad de veces que ocurre una cadena en cada una de las DESCRIPCIONES.
Entonces, si quiero contar la cantidad de veces que aparece 'value', la instrucción sql devolverá esto:
TITLE | DESCRIPTION | COUNT
------------------------------------------------------------
test1 | value blah blah value | 2
test2 | value test | 1
test3 | test test test | 0
test4 | valuevaluevaluevaluevalue | 5
¿Hay alguna forma de hacer esto? No quiero usar php en absoluto, solo mysql.
CHAR_LENGTH()
lugar deLENGTH()
si está usando caracteres multibyte.Respuestas:
Esto debería funcionar:
fuente
LENGTH()
yCHAR_LENGTH()
mientras se divide en el mismo byte de conteo / char. @nicogawendaundevalue
tienevalue
en él, por lo que debe contarse. Si solo desea contar palabras completas, tal vez necesite buscar 'valor' o mejor algo más complicado como usar expresiones regulares.LENGTH( REPLACE ( LOWER(description), "value", "") )
y asegurarse de que "valor" siempre esté en minúscula utilizando PHPstrtolower()
. PD: Esta solución anterior me ayudó a construir mi propio pequeño motor de búsqueda y a ponderar los resultados por la cantidad de palabras dentro del texto. ¡Gracias!ROUND
aquí es innecesario. asumir una cadena de longitudx
conn
ocurrencias de'value
.LENGTH(description) - LENGTH( REPLACE ( description, "value", "") )
siempre te darán*length("value")
, bucear que por longitud de valor siempre dejará un número enteron
. No hay necesidad de redondearUna variación un poco más simple y más efectiva de la solución @yannis:
La diferencia es que reemplazo la cadena de "valor" con una cadena más corta de 1 carácter ("1234" en este caso). De esta manera, no necesita dividir y redondear para obtener un valor entero.
Versión generalizada (funciona para cada hilo de aguja):
fuente
prueba esto:
Demostración de violín SQL
fuente
En SQL SERVER, esta es la respuesta
Resultado
No tengo la instalación de MySQL, pero las gafas para encontrar el equivalente de LEN es LONGITUD mientras que REPLACE es igual.
Entonces la consulta equivalente en MySql debería ser
Avíseme si también funcionó para usted en MySql.
fuente
Aquí hay una función que hará eso.
fuente
Gracias Yannis, su solución funcionó para mí y aquí estoy compartiendo la misma solución para varias palabras clave con orden y límite.
fuente
Esta es la función mysql que usa la técnica espacial (probada con 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)) );
fuente