valores una separar separados separado separada por partes extraer dividir delimitada datos convertir consulta con como comas columna campo cadena sql mysql database

separar - Búsqueda de MySQL valores en una cadena separada por comas



separar por comas en sql (10)

Tengo un campo COLORS (varchar(50)) en una tabla SHIRTS que contiene una cadena delimitada por comas como 1,2,5,12,15, Cada número representa los colores disponibles.

Al ejecutar la consulta, select * from shirts where colors like ''%1%'' para obtener todas las camisetas rojas (color = 1), también obtengo las camisetas cuyo color es gris (= 12) y naranja (= 15).

¿Cómo debo reescribir la consulta para que solo seleccione el color 1 y no todos los colores que contienen el número 1?


Eche un vistazo a la función documentation para MySQL.

SELECT * FROM shirts WHERE FIND_IN_SET(''1'',colors) > 0


En realidad, debe arreglar su esquema de base de datos para que tenga tres tablas:

shirt: shirt_id, shirt_name color: color_id, color_name shirtcolor: shirt_id, color_id

Entonces, si quieres encontrar todas las camisas que son rojas, harías una consulta como:

SELECT * FROM shirt, color WHERE color.color_name = ''red'' AND shirt.shirt_id = shirtcolor.shirt_id AND color.color_id = shirtcolor.color_id


Esto funcionará con seguridad, y de hecho lo probé:

lwdba@localhost (DB test) :: DROP TABLE IF EXISTS shirts; Query OK, 0 rows affected (0.08 sec) lwdba@localhost (DB test) :: CREATE TABLE shirts -> (<BR> -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> ticketnumber INT, -> colors VARCHAR(30) -> );<BR> Query OK, 0 rows affected (0.19 sec) lwdba@localhost (DB test) :: INSERT INTO shirts (ticketnumber,colors) VALUES -> (32423,''1,2,5,12,15''), -> (32424,''1,5,12,15,30''), -> (32425,''2,5,11,15,28''), -> (32426,''1,2,7,12,15''), -> (32427,''2,4,8,12,15''); Query OK, 5 rows affected (0.06 sec) Records: 5 Duplicates: 0 Warnings: 0 lwdba@localhost (DB test) :: SELECT * FROM shirts WHERE LOCATE(CONCAT('','', 1 ,'',''),CONCAT('','',colors,'','')) > 0; +----+--------------+--------------+ | id | ticketnumber | colors | +----+--------------+--------------+ | 1 | 32423 | 1,2,5,12,15 | | 2 | 32424 | 1,5,12,15,30 | | 4 | 32426 | 1,2,7,12,15 | +----+--------------+--------------+ 3 rows in set (0.00 sec)

Darle una oportunidad !!!


La forma clásica sería agregar comas a la izquierda y a la derecha:

select * from shirts where CONCAT('','', colors, '','') like ''%,1,%''

Pero find_in_set también funciona:

select * from shirts where find_in_set(''1'',colors) <> 0


Puede lograr esto siguiendo la función.

Ejecute la siguiente consulta para crear una función.

DELIMITER || CREATE FUNCTION `TOTAL_OCCURANCE`(`commastring` TEXT, `findme` VARCHAR(255)) RETURNS int(11) NO SQL -- SANI: First param is for comma separated string and 2nd for string to find. return ROUND ( ( LENGTH(commastring) - LENGTH( REPLACE ( commastring, findme, "") ) ) / LENGTH(findme) );

Y llama a esta función como esta

msyql> select TOTAL_OCCURANCE(''A,B,C,A,D,X,B,AB'', ''A'');

Espero que ayude.


Si el conjunto de colores es más o menos fijo, la forma más eficiente y más legible sería usar constantes de cadena en su aplicación y luego usar el tipo SET de MySQL con FIND_IN_SET(''red'',colors) en sus consultas. Al usar el tipo SET con find_in_set , MySQL usa un entero para almacenar todos los valores y usa la operación binaria "and" para verificar la presencia de valores, que es mucho más eficiente que escanear una cadena separada por comas.

En SET(''red'',''blue'',''green'') , ''red'' se almacenaría internamente como 1 , ''blue'' se almacenaría internamente como 2 y ''green'' se almacenaría internamente como 4 . El valor ''red,blue'' se almacenará como 3 ( 1|2 ) y ''red,green'' como 5 ( 1|4 ).



Todas las respuestas no son realmente correctas, prueba esto:

select * from shirts where 1 IN (colors);


documentation es tu amigo en este caso

select * from shirts where FIND_IN_SET(1,colors)


select * from shirts where find_in_set(''1'',colors) <> 0

Funciona para mi