如何在MySQL中以逗号分隔的列表字段中选择项目

时间:2011-05-26 10:02:09

标签: mysql sorting

我有一个名为product的表,我在category字段中插入了大约5到6个类别。

例如2,3,4,5,12就像那样。

但是当我使用这个查询时,它不起作用:

SELECT * FROM product WHERE category in '3' 

SELECT * FROM `product` WHERE `category` LIKE '%3%' 

任何人都可以帮忙修复它

4 个答案:

答案 0 :(得分:8)

SELECT * FROM product WHERE FIND_IN_SET('3',category); 

请参阅:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

如果您没有find_in_set,则此代码将是等效的:

SELECT * FROM product 
WHERE category = '3' or category LIKE '%,3,%' 
      or category LIKE '3,%' or category LIKE '%,3'; 

否则你会在'13, 23, 40'上获得3的误报。

警告
但请注意,将CSV列表放在字段中是非常糟糕的做法 通过从字段中提取列表并将其放在另一个表中的1对N关系,您将获得更好的性能。

答案 1 :(得分:2)

最佳做法是创建另一个表格!

即: 产品类别 int productid int category

SELECT * FROM product p 
INNER JOIN product_categories pc ON pc.productid = p.productid 
WHERE pc.category = '3'

根据你想要实现它的方式,当类别'13'可用时你也会遇到问题,但你想要'3'

答案 2 :(得分:1)

我很遗憾地说出来但你应该重新设计你的数据库 使用单个字段来存储多个连接将始终是一个痛苦的对接。

创建一个存储关系的附加表要容易得多。

答案 3 :(得分:1)

IN语句不起作用,因为当你实际上是“2,3,4,5,12”时,你要求该类别与“3”完全匹配。我认为它也应该在圆括号中。

正如用户737767所说,您应该normalise您的数据库,这样您就拥有了一个类别表,一个产品表和另一个表,以显示每个产品属于哪些类别。

您的LIKE声明也是一个坏主意,因为搜索“3”也会带回“23”等结果