MySQL - Buscar en campo con registros separados por comas

   
Vista:

Buscar en campo con registros separados por comas

Publicado por Daniel (8 intervenciones) el 24/06/2015 11:01:23
Hola programadores, a ver si una de vuestras iluminadas mentes me puede ayudar, mi perdición son los campos que contienen datos separados por comas, tengo un campo que se llama cCategorias y tiene los datos así: 7,16,35,98,120,135,202,504,995 y necesito sacar los datos de los registros que contenga 2 números, algo como:

SELECT * FROM productos WHERE cCategorias=926 AND cCategorias=942

pero obviamente esto no funciona si no, os estaría pidiendo ayuda, ejeje.

Muchas gracias de antemano, un saludo.
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

Buscar en campo con registros separados por comas

Publicado por Rafael (55 intervenciones) el 24/06/2015 11:43:33
podrias usar algo asi...
1
2
3
4
SELECT *
FROM   PRODUCTOS
WHERE  CCATEGORIAS LIKE '%926,%'
OR     CCATEGORIAS LIKE '%942,%'

Ya nos contaras...
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

Buscar en campo con registros separados por comas

Publicado por Daniel (8 intervenciones) el 24/06/2015 12:19:53
Ha ido como la seda solo unas pequeñas modificaciones, muchas gracias, la solución ha sido mucho mas fácil de lo que creía, ya probé con el LIKE pero por algún motivo no obtuve el resultado que buscaba, finalmente quedo asi:

SELECT *
FROM productos
WHERE cCategorias LIKE '%942%'
and cCategorias LIKE '%926%'
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

Buscar en campo con registros separados por comas

Publicado por Rafael (55 intervenciones) el 24/06/2015 14:41:48
Solo comentarte un par de detalles...

Imagina que tienes en cCategorias estos valores 7,16,35,98,120,135,202,504,995
Haciendolo como al final has puesto y buscas el valor "20" este apareceria por que coincide con el
120 y el 202
En tu pregunta anterior te habia comentado de la funcion FIND_IN_SET()

Yo creo lo mas correcto en este caso seria usarla asi:
1
2
3
4
SELECT *
FROM productos
WHERE FIND_IN_SET ('942', cCategorias) > 0
AND FIND_IN_SET ('926', cCategorias) > 0

Saludos
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

Buscar en campo con registros separados por comas

Publicado por Daniel (8 intervenciones) el 24/06/2015 16:08:35
voy a probar porque la solucion anterior no es valida da errores
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

Buscar en campo con registros separados por comas

Publicado por Daniel (8 intervenciones) el 24/06/2015 17:26:17
FIND_IN_SET no me sirve porque en el momento que le meto un OR ya no funciona
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

Buscar en campo con registros separados por comas

Publicado por leonardo_josue (81 intervenciones) el 24/06/2015 18:11:00
Hola Daniel;

En primer lugar un comentario: ¿por qué tienes un campo que permite multivalores? esta práctica es un completo error y está absolutamente prohibido en un modelo E-R?

NUNCA, absolutamente NUNCA debes tener un campo como lo mencionas (con valores separados por algún caracter). Si hicieras esto en un examen de SQL estarías reprobado, si haces esto en una empresa, serías despedido.

En otras palabras, si tienes oportunidad de cambiar tu modelo de datos a poner esto dentro de una tabla y normalizar tu BD's hazlo y evitate dolores de cabeza... el que tengas pereza o que cueste trabajo NO ES UNA RAZÓN VÁLIDA PARA NO HACERLO.

Ahora bien, cuando efectivamente no puedes cambiar tu modelo de datos, entonces la respuesta que da Rafael es la correcta: la mejor manera de hacer lo que quieres es con FIND_IN_SET.

Tu comentas esto;

1
2
3
la solucion anterior no es valida da errores
 
FIND_IN_SET no me sirve porque en el momento que le meto un OR ya no funciona

¿Cuáles son los errores que da MySQL? ¿Por qué dices que al colocar un OR no funciona? Sin esta información es imposible tratar de ayudarte, pero FIND_IN_SET funciona perfectamente para lo que quieres hacer, inclusive utilizando sentencias tipo OR:

Supongamos una tabla con estos datos:

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM tabla;
+------+--------------------------------+
| id   | campo                          |
+------+--------------------------------+
|    1 | 7,16,35,98,120,135,202,504,995 |
|    2 | 1,2,3,4,5,6,7                  |
|    3 | 2,4,6,8,10                     |
+------+--------------------------------+
3 rows in set (0.00 sec)

Si queremos seleccionar aquellos donde haya un sólo valor (como ejemplo el 7) hacemos un FIND_IN_SET simple:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT *
    -> FROM tabla
    -> WHERE FIND_IN_SET('7', campo) > 0;
+------+--------------------------------+
| id   | campo                          |
+------+--------------------------------+
|    1 | 7,16,35,98,120,135,202,504,995 |
|    2 | 1,2,3,4,5,6,7                  |
+------+--------------------------------+
2 rows in set (0.00 sec)

Si queremos encontrar un registro donde existan DOS VALORES A LA VEZ, como es tu caso, (como ejemplo el 7 y el 120) hacemos dos FIND_IN_SET con un AND, como dice Rafael:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT *
    -> FROM tabla
    -> WHERE FIND_IN_SET('7', campo) > 0 AND
    ->       FIND_IN_SET('120', campo) > 0;
+------+--------------------------------+
| id   | campo                          |
+------+--------------------------------+
|    1 | 7,16,35,98,120,135,202,504,995 |
+------+--------------------------------+
1 row in set (0.00 sec)

Si queremos encontrar los registros que contengan al menos uno de los dos valores (como ejemplo el 1 o el 120), entonces hacemos un OR:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT *
    -> FROM tabla
    -> WHERE FIND_IN_SET('1', campo) > 0 OR
    ->       FIND_IN_SET('120', campo) > 0;
+------+--------------------------------+
| id   | campo                          |
+------+--------------------------------+
|    1 | 7,16,35,98,120,135,202,504,995 |
|    2 | 1,2,3,4,5,6,7                  |
+------+--------------------------------+
2 rows in set (0.00 sec)

Entonces, ¿Dónde está el problema? postea lo que intentaste hacer, incluye LOS MENSAJES DE ERROR que te aparezcan, si no obtienes el resultado esperado ENTONCES DINOS QUÉ ES LO QUE ESTÁS OBTENIENDO Y QUÉ ES LO QUE DEBERÍAS OBTENER. Entre más detalles nos des más factible será que podamos ayudarte.

Saludos
Leo
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

Buscar en campo con registros separados por comas

Publicado por Daniel (8 intervenciones) el 24/06/2015 18:53:05
Gracias por tu explicacion, yo no cree la base de datos fue una empresa, para mi tambien es un error y yo nunca lo haria, cuando pongo un OR tal como tu lo has hecho en el ultimo ejemplo, no me arroja ningun resultado y se queda Running por tiempo indefinido hasta ahora lo mas que he aguantado han sido 20 minutos.
Muchas gracias otra vez
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