108 votes

Recherche de valeurs de requête MySQL dans une chaîne séparée par des virgules

J'ai un champ COLORS (varchar(50)) dans une table SHIRTS qui contient une chaîne délimitée par des virgules telle que 1,2,5,12,15,. Chaque nombre représentant les couleurs disponibles.

Lors de l'exécution de la requête select * from shirts where colors like '%1%' pour obtenir toutes les chemises rouges (couleur=1), j'obtiens également les chemises dont la couleur est grise (=12) et orange (=15).

Comment dois-je réécrire la requête pour NE sélectionner que la couleur 1 et pas toutes les couleurs contenant le chiffre 1 ?

217voto

Andomar Points 115404

La façon classique serait d'ajouter des virgules à gauche et à droite :

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

Mais find_in_set fonctionne aussi :

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

39voto

Framework Points 32799

FIND_IN_SET est votre ami dans ce cas

select * from shirts where FIND_IN_SET(1,colors) 

30voto

Joe Stefanelli Points 72874

Jetez un œil à la fonction FIND_IN_SET pour MySQL.

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

12voto

RolandoMySQLDBA Points 19439

Cela va marcher, et je l'ai vraiment essayé :

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)

Faites un essai ! ! !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X