列表中的mysql仅验证列表中的第一个id。也许是一个blob问题

时间:2011-03-28 10:12:14

标签: mysql list select

我使用的系统使用逗号分隔值作为一对多关系。它以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。

4 个答案:

答案 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)

是的,这是astring问题。你的'list'只是mysql的一个字符串,没什么意思。

您必须使用RegEx

但您可能会考虑规范化表格。