MySQL查询以逗号分隔的字符串查找值

时间:2011-02-17 18:35:01

标签: sql mysql database

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

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

我应该如何重写查询,以便仅选择颜色1而不是所有包含数字1的颜色?

10 个答案:

答案 0 :(得分:163)

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

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

find_in_set也有效:

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

答案 1 :(得分:28)

在这种情况下,

FIND_IN_SET是你的朋友

select * from shirts where FIND_IN_SET(1,colors) 

答案 2 :(得分:22)

查看MySQL的FIND_IN_SET函数。

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

答案 3 :(得分:10)

这肯定会有用,我实际上已经尝试过了:

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)

试一试!!!

答案 4 :(得分:6)

如果颜色的集合或多或少是固定的,那么最有效且最易读的方法是在您的应用中使用字符串常量,然后在查询中使用带有SET的MySQL FIND_IN_SET('red',colors)类型。当SET类型与FIND_IN_SET一起使用时,MySQL使用一个整数来存储所有值并使用二进制"and"操作来检查值的存在,这比扫描逗号分隔的方式更有效字符串。

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

答案 5 :(得分:3)

如果你正在使用MySQL,你可以使用一种方法REGEXP ......

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

那么你会使用:

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

答案 6 :(得分:3)

您应该实际修复数据库架构,以便有三个表:

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

然后,如果你想找到所有红色的衬衫,你可以进行如下查询:

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

答案 7 :(得分:1)

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

为我工作

答案 8 :(得分:0)

您可以通过以下功能实现此目的。

运行以下查询以创建功能。

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

希望它有所帮助。

答案 9 :(得分:0)

1。对于MySQL:

SELECT FIND_IN_SET(5, columnname) AS result 
FROM table

2。对于Postgres SQL:

SELECT * 
FROM TABLENAME f
WHERE 'searchvalue' = ANY (string_to_array(COLUMNNAME, ','))

示例

select * 
from customer f
where '11' = ANY (string_to_array(customerids, ','))