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的SET
types。 在FIND_IN_SET中使用SET
types时,MySQL使用一个整数来存储所有值,并使用二进制"and"
操作来检查是否存在值,这比扫描逗号分隔的string更有效。
在SET('red','blue','green')
, 'red'
在内部被存储为1
, 'blue'
在内部被存储为2
, 'green'
在内部被存储为4
。 值'red,blue'
将被存储为3
( 1|2
), 'red,green'
为5
( 1|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);