我使用的系统使用逗号分隔值作为一对多关系。它以blob形式存储。
我尝试使用MySQL IN(LIST),但最后只有uid在列表中的第一行或列表中只有一行。
mytable
uid categories
1 24,25,26
2 25
3 22,23,25
4 25,27
run sql:
SELECT * FROM mytable WHERE 25 IN (categories)
Result:
uid categories
2 25
4 25,27
Missing (should have been selected but are not)
uid categories
1 24,25,26
3 22,23,25
知道为什么一个字符串必须从25开始而不只是包含25?我想这是一个字符串问题而不是IN(LIST)问题
更新 - 基于以下答案:
在blob上使用IN(LIST)时,blob将转换为int和逗号,并且“数字”将丢失。
代替使用FIND_IN_SET(needle,haystack),它也适用于包含逗号分隔值的blob。
答案 0 :(得分:3)
我认为您正在寻找FIND_IN_SET
SELECT * FROM mytable WHERE FIND_IN_SET(25,category)
答案 1 :(得分:3)
这应该给你答案:
SELECT * FROM mytable WHERE CONCAT(',', categories, ',') LIKE '%,25,%'
但创建一个连接表会更有意义,每个逗号分隔的值都是一个新行。
答案 2 :(得分:1)
正在发生的事情是MySQL正在将blob转换为整数(不是整数列表)以进行比较。因此'24,25,26'变为值24.您可以通过运行查询来确认这一点
SELECT CAST(categories AS signed) FROM mytable
这不是如何使用IN
(也不是blob数据类型)。你有没有理由不使用另一张桌子?
答案 3 :(得分:0)