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

Probloemas con like

Estas en el tema de Probloemas con like en el foro de Mysql en Foros del Web. Tengo los siguientes valores en una tabla de una base de datos: nombres jose antonio , ramon , jose maria , gonzalo jose antonio , ...
  #1 (permalink)  
Antiguo 14/03/2012, 11:03
 
Fecha de Ingreso: diciembre-2010
Mensajes: 61
Antigüedad: 13 años, 4 meses
Puntos: 4
Probloemas con like

Tengo los siguientes valores en una tabla de una base de datos:

nombres

jose antonio , ramon , jose maria , gonzalo
jose antonio , jose , luis , gonzalo
jose , mario , alvaro , fernado , jose luis

Ahora necesito seleccionar los registros que continen la palabra "jose" pero sólo y exclusivamente jose, no vale jose antonio etc... sólo jose

Alguien me puede dar una pista por donde ir?
  #2 (permalink)  
Antiguo 14/03/2012, 11:12
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Probloemas con like

Saludos

por que no lo realizas con =

Código SQL:
Ver original
  1. SELECT * FROM tabla WHERE nombre='jose'
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #3 (permalink)  
Antiguo 14/03/2012, 11:26
 
Fecha de Ingreso: diciembre-2010
Mensajes: 61
Antigüedad: 13 años, 4 meses
Puntos: 4
Respuesta: Probloemas con like

Cita:
Iniciado por Nano_ Ver Mensaje
Saludos

por que no lo realizas con =

Código SQL:
Ver original
  1. SELECT * FROM tabla WHERE nombre='jose'
no encuentra nada tal vez me he explicado mal

tabla nombres

'id' | nombres |
----------------------------------------------------------------------------------------
1 | jose antonio , ramon , jose maria , gonzalo |
----------------------------------------------------------------------------------------
2 | jose antonio , jose , luis , jose luis |
----------------------------------------------------------------------------------------
3 | jose , mario , alvaro , fernado , jose |
----------------------------------------------------------------------------------------



Necesito que la consulta me devuelva el registro 2 y 3.
  #4 (permalink)  
Antiguo 14/03/2012, 11:40
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: Probloemas con like

Tienes dos problemas:
1) Has creado un campo multivaluado, que no deben existir en una base de datos relacional. Los campos multivaluados implican que existe una relación 1:N o N:N que no está normalizada.
2) No puedes discriminar sólo "josé" en el contexto de esos datos de una forma sencilla (es una consecuencia del error de normalización), sin usar funciones especiales, como FIND_IN_SET(). Pero ese tipo de funciones no soportan LIKE, ni búsquedas de MATCH ... AGAINST, por lo que su uso es relativo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 14/03/2012, 11:51
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Probloemas con like

concuerdo con gnzsoloyo, igualmente podrias intentar algo como lo siguiente, aunque es algo nefasto y aunque funcione no lo recomiendo

Código SQL:
Ver original
  1. SELECT *
  2. FROM tabla
  3. WHERE nombre LIKE '%, jose ,%'
  4.     OR nombre LIKE 'jose ,%'
  5.     OR nombre LIKE '%, jose'
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #6 (permalink)  
Antiguo 14/03/2012, 11:57
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Probloemas con like

Cita:
EDITO: No había leído la respuesta de h2swider, es la misma que doy. Saludos.
Hola yop289:

Tal como ya lo mencionó acertadamente gnzsoloyo tienes un grave problema con el modelo de datos que estás manejando al tener campos multivaluados, pero por experiencia propia sé que en muchas ocasiones no es posible realizar un cambio al modelo (sobre todo cuando el jefe no quiere aplicar cambios ), por lo tanto hay que ajustarse a lo que hay. veo que estás utilizando como separador espacio-coma-espacio correcto??? si es así, se me ocurren dos formas para resolver tu problema:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM nombres;
  2. +------+---------------------------------------------+
  3. | id   | nombres                                     |
  4. +------+---------------------------------------------+
  5. |    1 | jose antonio , ramon , jose maria , gonzalo |
  6. |    2 | jose antonio , jose , luis , jose luis      |
  7. |    3 | jose , mario , alvaro , fernado , jose      |
  8. +------+---------------------------------------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT id, nombres FROM nombres
  12.     -> WHERE
  13.     -> FIND_IN_SET('jose', REPLACE(nombres, ' , ', ',')) > 0;
  14. +------+----------------------------------------+
  15. | id   | nombres                                |
  16. +------+----------------------------------------+
  17. |    2 | jose antonio , jose , luis , jose luis |
  18. |    3 | jose , mario , alvaro , fernado , jose |
  19. +------+----------------------------------------+
  20. 2 rows in set (0.00 sec)
  21.  
  22. mysql>
  23. mysql> SELECT id, nombres FROM nombres
  24.     -> WHERE
  25.     -> nombres LIKE 'jose ,%' OR
  26.     -> nombres LIKE '%, jose ,%' OR
  27.     -> nombres LIKE '%, jose';
  28. +------+----------------------------------------+
  29. | id   | nombres                                |
  30. +------+----------------------------------------+
  31. |    2 | jose antonio , jose , luis , jose luis |
  32. |    3 | jose , mario , alvaro , fernado , jose |
  33. +------+----------------------------------------+
  34. 2 rows in set (0.00 sec)

En el primer ejemplo utiliza la función FIND_IN_SET para buscar, pero el separador por defecto es coma, no espacio-coma-espacio... por eso el REPLACE.

La segunda forma sería buscando las posibles posiciones donde encontrar la palabra, es decir, al inicio de la cadena, en medio o al final. Por supuesto que esto puede resultar fatal para el rendimiento del servidor.

Soy de la misma opinión que gnzsoloyo, si te es posible cambia tu modelo de datos y evita dolores de cabeza en el futuro.

Saludos
Leo.
  #7 (permalink)  
Antiguo 14/03/2012, 14:00
 
Fecha de Ingreso: diciembre-2010
Mensajes: 61
Antigüedad: 13 años, 4 meses
Puntos: 4
Respuesta: Probloemas con like

Lo primero gracias a todos;

Reconozco que el campo es un desastre pero es lo que hay, y el problema es algo más complejo, ya que el separador puede ser cualquier caracter y no tiene porque haber espacios entre el separador y la palabra por lo que la solución

Cita:
Iniciado por leonardo_josue Ver Mensaje
mysql>
mysql> SELECT id, nombres FROM nombres
-> WHERE
-> nombres LIKE 'jose ,%' OR
-> nombres LIKE '%, jose ,%' OR
-> nombres LIKE '%, jose';
+------+----------------------------------------+
| id | nombres |
+------+----------------------------------------+
| 2 | jose antonio , jose , luis , jose luis |
| 3 | jose , mario , alvaro , fernado , jose |
+------+----------------------------------------+
2 rows in set (0.00 sec)[/HIGHLIGHT]
la descarto por la razon comentada anteriormente, voy ha investigar la opcion de FIND in SET, aunque es posible tener problemas ya que veo que los datos han de estar entre comas, y sin espacios jur,


de todas formas gracias a todos por las repuestas.
  #8 (permalink)  
Antiguo 15/03/2012, 05:57
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Probloemas con like

Si el separador puede variar y ser cualquier cosa como dices, te recomiendo tirar a la basura esa tabla. No tienes nada que hacer con ella
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #9 (permalink)  
Antiguo 15/03/2012, 06:15
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: Probloemas con like

Estoy de acuerdo con h2swider. SI no puedes normalizar los datos que contedrá ese campo (en el supuesto caso de que no puedas modificar esa estructura tan mal pensada), tendrás que conseguir ayuda en Hogwarts...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: registros, tabla
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 15:16.