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

时间:2015-01-07 16:48:58

标签: mysql sql

在MySQL表中我有一个字段,包含给定记录的这个值:" 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搜索时,我该怎么做才能获得记录?我错过了什么?

由于

5 个答案:

答案 0 :(得分:3)

您似乎在字段中存储逗号分隔值。这是坏事,坏事,坏事。您应该使用联结表,每个值一行。

但是,有时你会被特定结构中的数据所困扰。如果是这样,MySQL提供find_in_set()函数。

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

答案 1 :(得分:2)

你不能在逗号分隔的no.s列表中使用IN(),这样可以更好地规范化你的结构,现在你可以使用find_in_set来查找与逗号分隔的字符串匹配的结果

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

答案 2 :(得分:1)

之前已经提出并回答了这个问题,但我不想去寻找它;这个问题应该作为副本关闭。但是,回答你的问题:

字符串中的逗号(列值)只是字符。这些是字符串的一部分。它们不被视为"分隔符" SQL文本中的值之间。 SQL看到它的方式,该列包含单个值,而不是"列表"价值观。

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

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

那些并不相等,所以不会返回该行。令人惊讶的是#34;在以下情况下找到匹配项:

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

解释了因为该字符串正在数字上下文中进行评估。也就是说,比较返回true,因为所有这些都是正确的:

... 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

答案 3 :(得分:0)

在mysql IN子句中用作

SELECT * FROM mytable WHERE column_name IN (set_of_values) ;

提及列名而不是值

答案 4 :(得分:0)

请尝试

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