MySQL In 子句没有给出正确的结果

MySQL In clause not giving the right result

在 MySQL table 我有一个字段,包含给定记录的这个值:“1908,2315,2316”

这是我的 sql 查询:

SELECT * FROM mytable WHERE 2316 IN (myfield) 

我有 0 个结果!

我试过了:

SELECT * FROM mytable WHERE 2315 IN (myfield) 

还有 0 个结果

然后我尝试了这个:

SELECT * FROM mytable WHERE 1908 IN (myfield) 

没想到我用1908搜索到记录了!用2315和2316搜索时应该怎么做才能同时获得记录?我错过了什么?

谢谢

在mysql中IN子句被用作

SELECT * FROM mytable WHERE column_name IN (set_of_values) ;

提及列名称而不是值

您不能在 no.s 的逗号分隔列表上使用 IN() 最好先规范化您的结构 现在您可以使用 find_in_set 查找与逗号分隔字符串匹配的结果

SELECT * FROM mytable WHERE find_in_set('1908',myfield) > 0

请尝试

SELECT * FROM mytable WHERE LOCATE(CONCAT (',', 2316 ','), CONCAT (',',myfield,',' ) ) <>0

您似乎在字段中存储以逗号分隔的值。这很糟糕,很糟糕,很糟糕。您应该使用一个联结点 table,每个值一行。

但是,有时您会被特定结构的数据困住。如果是这样,MySQL 提供 find_in_set() 功能。

SELECT *
FROM mytable
WHERE find_in_set(2316, myfield) > 0;

这个问题以前有人问过也有人回答过,但我不想再去找了;这个问题应该作为重复问题关闭。但是,回答你的问题:

字符串中的逗号,列值,只是个字符。这些是字符串的一部分。它们不会被视为 SQL 文本中值之间的 "separators"。在 SQL 看来,该列包含一个 单个 值,而不是 "list" 个值。

因此,在您的查询中,IN (field) 相当于 equals 比较。它相当于与字符串进行比较。例如:

... WHERE 2316 = '1908,2315,2316'

并且它们不相等,因此不会返回该行。 "surprisingly" 找到匹配项,在以下情况下:

... WHERE 1908 IN ('1908,2315,2316')

之所以这样解释是因为该字符串是在 数字 上下文中计算的。也就是说,比较 returns 为真,因为所有这些也为真:

... WHERE 1908 = '1908,2315,2316' + 0
... WHERE 1908 = '1908xyz' + 0
... WHERE 1908 = '1907qrs' + 1

(在数字上下文中求值时,字符串会转换为数字。恰好字符串求值的数值等于它所比较的​​整数值。)


您可以使用 MySQL FIND_IN_SET 函数。例如:

... WHERE FIND_IN_SET(2316,'1908,2315,2316')

但是,请认真重新考虑存储逗号分隔列表的设计。我推荐 Bill Karwin 的 "SQL Antipatterns" 书...

http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557