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

Ayuda con consulta, select.

Estas en el tema de Ayuda con consulta, select. en el foro de Mysql en Foros del Web. Estimada comunidad, tengo un problema que no logro solucionar. tengo una tabla productos, con un campo llamado elec, en el cual guardo valores como 1, ...
  #1 (permalink)  
Antiguo 17/03/2010, 00:17
 
Fecha de Ingreso: febrero-2010
Mensajes: 24
Antigüedad: 14 años, 2 meses
Puntos: 0
Ayuda con consulta, select.

Estimada comunidad, tengo un problema que no logro solucionar.
tengo una tabla productos, con un campo llamado elec, en el cual guardo valores como 1, 2, o 3, valores que son seleccionados a traves de un checkbox por formulario web. Eso lo hago impecable, el problema esta al hacer un Select, y quiero mostrar por ejemplo todas las personas que tienen elegido el numero 2, aunque tengan elegido el 1 y/o 3.

EJEMPLO: Si una persona ingresa 1 y 2, lo guarda en la base de datos de la misma forma, es decir, Elec = 1,2 , si hago la sgte consulta:

SELECT * FROM `productos` WHERE `elec`= 2 , no muestra la coincidencia, pues logro analizar que la consulta SOLO verifica el primer registro del atributo Elec, que es 1 en este ejemplo, aunque este contenga el numero 2.

Me funciona el And y Or en caso quiera hacer ese tipo de seleccion, solo NO me resulta cuando quiero mostrar solo registros que tengan en el Elec = 2, aunque haya elegido el 1.

Espero se entienda.

Como puedo arreglar esa consulta??
De antemano gracias por la ayuda.
  #2 (permalink)  
Antiguo 17/03/2010, 08:18
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Ayuda con consulta, select.

El campo elec es varchar?
si el usuario selecciona 2 o 3, se lamacenan separados por comas?

No logro entender muy bien el problema.

saludos duja
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 17/03/2010, 11:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con consulta, select.

Prueba con FIND_IN_SET()
Código MySQL:
Ver original
  1. SELECT * FROM `productos` WHERE FIND_IN_SET('2', elec) > 0;
  #4 (permalink)  
Antiguo 17/03/2010, 14:44
 
Fecha de Ingreso: febrero-2010
Mensajes: 24
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Ayuda con consulta, select.

Gracias por responder, así es, es varchar y al guardar, queda separados por coma ;
Saludos
  #5 (permalink)  
Antiguo 17/03/2010, 15:10
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Ayuda con consulta, select.

Entonces aplica la solución que te da jurena.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 17/03/2010, 22:55
 
Fecha de Ingreso: febrero-2010
Mensajes: 24
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Ayuda con consulta, select.

Cita:
Iniciado por huesos52 Ver Mensaje
Entonces aplica la solución que te da jurena.

saludos
Gracias por toda la ayuda, pero he probado los consejos, y sigo con el problema , he buscado y probado y nada.
  #7 (permalink)  
Antiguo 17/03/2010, 23:08
 
Fecha de Ingreso: febrero-2010
Mensajes: 24
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Ayuda con consulta, select.

Cita:
Iniciado por duja Ver Mensaje
Gracias por toda la ayuda, pero he probado los consejos, y sigo con el problema , he buscado y probado y nada.
Encontre una solución, no se si será lo mas elgante pero funciona, utilizando un LIKE quedaría de la siguiente forma:

$result = mysql_query("SELECT nombre, mail FROM alumno WHERE elec LIKE "%1%"");

Funciona, el 1 puede cambiar a 2, asi no importa si en el registro esta 1,2 o 2 , contar contenga el 2 lo selecciona igual.

Gracias a todos por la ayuda.
  #8 (permalink)  
Antiguo 18/03/2010, 05:11
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: Ayuda con consulta, select.

Es una solución más o menos práctica. El problema es que te devolverá también aquellos registros que contengan, 12, 22, 20 (y todos los 2...), 32, 42, etc...

El problema inicial es que tienes un error de diseño en la base: Cuando un mismo registro tiene más de un valor asignado a un campo, ese campo debe derivarse en una relación que contenga un registro por valor vinculados a su registro padre.
Esto es por un principio simple: En una base de datos no puede haber campos multivaluados.
Ahora, como ya has hecho el ingreso de datos así, solamente te queda usar FIND_IN_SET(), tal como te lo dijo Jurena:
Código MySQL:
Ver original
  1. FROM `productos`
  2. WHERE FIND_IN_SET('2', elec) > 0;
El ejemplo es simple de entender: Devuelve aquellos registros donde el valor devuelto por la función sea mayor a 1, esto es, busca en una cadena separada por comas, un valor devuelto.
No puede fallar, a menos que el registro no contenga lo que supones que contiene... ya que una pequeña variación hará que el registro no sea devuelto:
Código MySQL:
Ver original
  1. SELECT FIND_IN_SET('2', '02,1,3,5,6,7');
  2. +----------------------------------+
  3. | FIND_IN_SET('2', '02,1,3,5,6,7') |
  4. +----------------------------------+
  5. |                                0 |
  6. +----------------------------------+
  7. 1 row in set (0.00 sec)
  8.  
  9. SELECT FIND_IN_SET('2', '2,1,3,5,6,7');
  10. +---------------------------------+
  11. | FIND_IN_SET('2', '2,1,3,5,6,7') |
  12. +---------------------------------+
  13. |                               1 |
  14. +---------------------------------+
  15. 1 row in set (0.00 sec)
  16.  
  17. mysql>
Como verás, "02" y "2" son interpretados de diferente forma.
Incluso, si hay espacios detrás del valor, el resultado cambia, porque la función hace la interpretación del valor como cadena, y en ese contexto el espacio vacío tiene un valor definido (ASCII 032):
Código MySQL:
Ver original
  1. SELECT FIND_IN_SET('2', '2 ,1,3,5,6,7');
  2. +----------------------------------+
  3. | FIND_IN_SET('2', '2 ,1,3,5,6,7') |
  4. +----------------------------------+
  5. |                                0 |
  6. +----------------------------------+
  7. 1 row in set (0.00 sec)

En otras palabras: El problema en tu caso no es que la función no sirva, esl problema es que tienes lo que se denomina "datos sucios".

Tienes dos caminos: O normalizas tu tabla, o realizas la búsqueda con una función almacenada creada para ello.
__________________
¿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: select
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:31.