Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Replace+mysql

Estas en el tema de Replace+mysql en el foro de Mysql en Foros del Web. Hola a todos: Estoy realizando búsquedas sobre mi BD y quisiera ordenar los resultados de mi búsqueda por coincidencias de palabras dentro del campo buscado ...
  #1 (permalink)  
Antiguo 30/11/2012, 10:12
 
Fecha de Ingreso: mayo-2009
Ubicación: La Habana
Mensajes: 92
Antigüedad: 14 años, 11 meses
Puntos: 0
Busqueda Replace+mysql

Hola a todos:

Estoy realizando búsquedas sobre mi BD y quisiera ordenar los resultados de mi búsqueda por coincidencias de palabras dentro del campo buscado ...la consulta viene siendo así:

Código MySQL:
Ver original
  1. LENGTH(items.title),
  2. LENGTH(REPLACE(LOWER(items.title), LOWER('an'), '')),
  3. LENGTH('an'),
  4. (LENGTH(items.title) - LENGTH(REPLACE(LOWER(items.title), LOWER('an'), ''))) / LENGTH('an') AS count,
  5. items.title
  6.  
  7. FROM items
  8.  
  9. WHERE items.title LIKE _utf8 '%an%' COLLATE utf8_general_ci

esta consulta me devuelve las cosas como yo quiero, pero le falta el detalle de poder contar los elementos tildados puesto que la función REPLACE no los reemplaza y por ende me dice que la coincidencia es 0 cuando realmente existe coincidencia, pero si no se le pone la tilde.

desde ya les agradezco su tiempo!!

saludos, kceres
  #2 (permalink)  
Antiguo 30/11/2012, 10:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Replace+mysql

¿Podrías explicar cómo es la lógica que aplicas a ese SELECT, y de qué forma se supone que esa búsqueda te devuelve algo que buscas?
Así como está, no parece muy entendible...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 30/11/2012, 10:36
 
Fecha de Ingreso: mayo-2009
Ubicación: La Habana
Mensajes: 92
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Replace+mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Podrías explicar cómo es la lógica que aplicas a ese SELECT, y de qué forma se supone que esa búsqueda te devuelve algo que buscas?
Así como está, no parece muy entendible...
Hola ...gracias por la rápida respuesta ...me explico mejor.

Código MySQL:
Ver original
  1. (LENGTH(title) - LENGTH(REPLACE(LOWER(title), LOWER('an'), ''))) / LENGTH('an') AS count,
  2. title
  3. *
  4. FROM items
  5. *
  6. WHERE title LIKE '%an%'

quité del sql anterior las cosas que no vienen al caso.

empiezo por lo fácil:

Código MySQL:
Ver original
  1. WHERE title LIKE '%an%'

aquí lo que estoy haciendo es buscando una semejanza entre las palabras ...un clásico LIKE

Código MySQL:
Ver original
  1. (LENGTH(title) - LENGTH(REPLACE(LOWER(title), LOWER('an'), ''))) / LENGTH('an') AS count

aquí lo que estoy haciendo es viendo las veces que se repite una palabra dentro del campo title ...por ejemplo ...si el campo tiene una longitud de 45 caracteres y la palabra que estoy buscando tiene una longitud de 5 caracteres la salida puede ser lo siguiente:

0 -> si no se reemplazo la cadena.
1-> si se encontró una coincidencia solamente
...
n -> si se encontró n coincidencias en el campo titulo

de esta forma puedes encontrar las veces que esta repetido un substring dentro del campo title y después ordenar DESC para tener las mayores coincidencias entre los primeros resultados.

Es que estoy usando InnoDB y no puedo realizar un Indice FULLTEXT ...la idea era esa, pero bueno.

bueno, espero haberme explicado un poco mejor ...otra vez gracias.
  #4 (permalink)  
Antiguo 30/11/2012, 12:55
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Replace+mysql

Hola kceres:

En realidad no veo nada malo en la lógica que estás poniendo en tu consulta, de hecho creo que debería funcionar...

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+----------+
  3. | id   | campo    |
  4. +------+----------+
  5. |    1 | ana      |
  6. |    2 | BanAna   |
  7. |    3 | otra     |
  8. |    4 | anan, an |
  9. +------+----------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT
  13.     -> id, campo,
  14.     -> (LENGTH(campo) - LENGTH(REPLACE(LOWER(campo), 'an', ''))) /
  15.     ->  LENGTH('an') no_campos
  16.     -> FROM tabla;
  17. +------+----------+-----------+
  18. | id   | campo    | no_campos |
  19. +------+----------+-----------+
  20. |    1 | ana      |    1.0000 |
  21. |    2 | BanAna   |    2.0000 |
  22. |    3 | otra     |    0.0000 |
  23. |    4 | anan, an |    3.0000 |
  24. +------+----------+-----------+
  25. 4 rows in set (0.00 sec)

El problema podría estar entonces en el filtrado... mucho ojo, si estás convirtiendo a mayúsculas y minúsculas, en el where también deberás hacer esa consideración:

Código:
...
WHERE LOWER(title) LIKE LOWER('%an%')
...
Postea cómo creaste tu tabla, para ver también si es un problema de COLLATION.

Saludos
Leo.
  #5 (permalink)  
Antiguo 30/11/2012, 19:58
 
Fecha de Ingreso: mayo-2009
Ubicación: La Habana
Mensajes: 92
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Replace+mysql

hola leonardo_josue ...creo que al final va a ser mejor terminar lo que quiero hacer con PHP ... después de todo con PHP no es tan complicado como puede llegar a convertirse con MySQL ...la consulta funciona correctamente, lo que no diferencia las tildes y una palabra que se escriba sin tilde pues sería un problema en la busqueda ...gracias de todos modos y bueno, si alguien da con la solución, pues bienvenido sea

saludos, kceres

Etiquetas: function, replace
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:20.