MySQL查询查找逗号分隔的string中的值

我有一个字段COLORS (varchar(50))在我的表SHIRTS ,其中包含逗号分隔的string,如1,2,5,12,15, 每个数字代表可用的颜色。

当运行查询select * from shirts where colors like '%1%'得到所有的红色衬衫(颜色= 1),我也得到了颜色是灰色(= 12)和橙色(= 15)的衬衫。

我应该如何重写查询,只select颜色1而不是所有包含数字1的颜色?

经典的方法是在左侧和右侧添加逗号:

 select * from shirts where ',' + colors + ',' like '%,1,%' 

但find_in_set也起作用:

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

看看MySQL的FIND_IN_SET函数。

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

在这种情况下FIND_IN_SET是你的朋友

 select * from shirts where FIND_IN_SET(1,colors) 

这将是肯定的,我实际上试了一下:

 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) 

试一试 !!!

如果一组颜色或多或less是固定的,那么最有效率也是最可读的方法是在你的应用中使用string常量,然后在你的查询中使用带有FIND_IN_SET('red',colors) MySQL的SETtypes。 在FIND_IN_SET中使用SETtypes时,MySQL使用一个整数来存储所有值,并使用二进制"and"操作来检查是否存在值,这比扫描逗号分隔的string更有效。

SET('red','blue','green')'red'在内部被存储为1'blue'在内部被存储为2'green'在内部被存储为4 。 值'red,blue'将被存储为31|2 ), 'red,green'51|4 )。

如果你使用MySQL,有一个方法REGEXP,你可以使用…

http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

那么你会使用:

 SELECT * FROM `shirts` WHERE `colors` REGEXP '\b1\b' 

实际上,您应该修复数据库模式,以便拥有三个表:

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

那么如果你想find所有的红色衬衫,你会做一个查询,如:

 SELECT * FROM shirt, color WHERE color.color_name = 'red' AND shirt.shirt_id = shirtcolor.shirt_id AND color.color_id = shirtcolor.color_id 
 select * from shirts where find_in_set('1',colors) <> 0 

为我工作

您可以通过以下function来实现此目的。

运行以下查询来创build函数。

 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) ); 

并像这样调用这个函数

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

希望它能帮上忙。

所有的答案是不正确的,试试这个:

 select * from shirts where 1 IN (colors);