MySQL - Consulta para contar palabras en registros tabla

 
Vista:
Imágen de perfil de Reinaldo

Consulta para contar palabras en registros tabla

Publicado por Reinaldo (3 intervenciones) el 05/01/2016 23:13:27
Saludo cordial.

Actualmente me encuentro desarrollando una base de datos en MySQL.

Estoy realizando una consulta que me cuente todas las palabras similares que se encuentren en varios registros, por ejemplo, si tengo la siguiente tabla Poema con la columna texto (cada línea es un registro):

TEXTO

................................................
Una noche, llena de estrellas,
noche estrellada, noche sin luna,
noche perdida en la nada,
noche helada, noche cansada.

Si uso la consulta:

SELECT COUNT(TEXTO) FROM poema WHERE texto like '%poema%';

Me devuelve 4, lo cual es un error ya que la palabra 'noche' aparece 6 veces.

He utilizado otras variantes de count y me genera lo mismo.

Entiendo que se puede crear una función para esto pero la verdad soy novato en SQL y no sé cómo crearla.

Gracias por su ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta para contar palabras en registros tabla

Publicado por xve (1151 intervenciones) el 06/01/2016 09:27:02
Hola Reinaldo, la instrucción COUNT() te cuenta los registros (lineas) donde aparece la palabra, no las veces que aparece dicha palabra.

La manera de contar las coincidencias de una palabra en una cadena, puede ser algo así:
1
SELECT LENGTH(REPLACE(TEXTO, 'noche', '')) AS `repeticiones` FROM poema
Esto te devolver el numero de veces que aparece la palabra noche en cara registro.

Para obtener el total, seria algo así:
1
2
select sum(`repeticiones`) from
(SELECT LENGTH(REPLACE(TEXTO, 'noche', '')) AS `repeticiones` FROM poema) as s

Espero que te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Reinaldo

Consulta para contar palabras en registros tabla

Publicado por Reinaldo (3 intervenciones) el 06/01/2016 14:15:48
Hola, y gracias por responder.

En cuanto a la consulta:

1
SELECT LENGTH(REPLACE(TEXTO, 'noche', '')) AS `repeticiones` FROM poema
Me devuelve el conteo de todos los caracteres que tiene cada registro, exceptuando los que contienen la cadena 'noche', por ejemplo, en el primer registro me devuelve el valor 25.

Y la segunda consulta me devuelve el valor 0.

Aunque estaríamos cerca, ya que si se pudiera modificar la primera consulta para que contara todas las cadenas de texto 'noche' para cada registro y luego las sumara, llegaríamos a lo que necesito.

Otra posible solución aunque poco efectiva y compleja sería contar todos los caracteres que no contengan la cadena 'noche' y restarlos de todos los caracteres que contenga la cadena 'noche', aunque esta consulta es compleja y generaría warnings o errores al obtener los resultados.

Lo otro sería definir una variable que contiene la cadena 'noche' y con esa variable buscar en cada registro cuántas veces se repite.

Trataré de implementarlo, aunque si alguien tiene la solución más efectiva, les agradezco.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta para contar palabras en registros tabla

Publicado por Rafael (97 intervenciones) el 08/01/2016 08:31:49
Hola:

La solucion esta mal enfocada, asi que por pasos:

1. Tenemos que saber cuando mide la cadena de texto en total. De acuerdo a tu ejemplo: 30
2. Si quitamos la pabra buscada (en este caso NOCHE) cuanto mide la misma cadena.: 25
3. Si al total de la cadena le restamos lo que mide sin la cadena buscada (5) y lo dividimos entre el largo de la cadena buscada (5) nos da (1) cuantas veces estaba esa cadena en el texto.

Asi pues en una primera aproximacion se puede obtener cuantas veces se encuentra el texto por cada registro con el ejemplo proporcionado:
Imagen

Usando esta consulta:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create table prueba
(titulo VARCHAR(100), texto VARCHAR(100));
 
INSERT INTO prueba values
('test1', 'Una noche, llena de estrellas,'),
('test2','noche estrellada, noche sin luna,' ),
( 'test3','noche perdida en la nada,'),
( 'test4','noche helada, noche cansada.'),
( 'test5','sin la palabra buscada');
 
select titulo
     , texto
     , length(texto) as largo_cadena
     , length(replace(texto,'noche','')) as largo_cadena_sin_palabra
     , (length(texto)-length(replace(texto,'noche','')))/length('noche')
       as veces
from   prueba
SQL Fiddle

Con este resultado podemos ahora sumar ...
1
2
3
4
5
6
7
8
9
select SUM(veces) as Total_Veces
from   (select titulo
             , texto
             , length(texto) as largo_cadena
             , length(replace(texto,'noche','')) as largo_cadena_sin_palabra
             , (length(texto)-length(replace(texto,'noche','')))/length('noche')
               as veces
        from   prueba) q1
;

Lo cual te dara 6.
Imagen

Saludos

Pd. Si la informacion te sirve a mi me sirve un +1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Reinaldo

Consulta para contar palabras en registros tabla

Publicado por Reinaldo (3 intervenciones) el 08/01/2016 20:57:36
Muchas gracias Rafael!, era lo que necesitaba. Era como pensaba, restando la cadena de cada registro y luego sumar las veces que se repite la misma cadena en el registro, al final sumar todas esas repeticiones.

La implementación es otra cosa, y por eso te has ganado tu valoración. :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

como guardar

Publicado por rene (1 intervención) el 21/04/2020 00:26:42
muy buen aporte acabo de ver este ejemplo y me gusto mucho ahora como puedo guardar estos datos en una base de datos esos resultados por favor.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar