我有一个名为product
的表,我在category
字段中插入了大约5到6个类别。
例如2,3,4,5,12
就像那样。
但是当我使用这个查询时,它不起作用:
SELECT * FROM product WHERE category in '3'
SELECT * FROM `product` WHERE `category` LIKE '%3%'
任何人都可以帮忙修复它
答案 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”等结果