Ver Mensaje Individual
  #8 (permalink)  
Antiguo 18/03/2010, 05:11
Avatar de gnzsoloyo
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, 5 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)