Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL In子句未给出正确的结果_Mysql_Sql - Fatal编程技术网

MySQL In子句未给出正确的结果

MySQL In子句未给出正确的结果,mysql,sql,Mysql,Sql,在MySQL表中,我有一个字段,包含给定记录的这个值:“190823152316” 以下是我的sql查询: SELECT * FROM mytable WHERE 2316 IN (myfield) 我得到了0个结果 我试过这个: SELECT * FROM mytable WHERE 2315 IN (myfield) SELECT * FROM mytable WHERE 1908 IN (myfield) 结果仍然是0 然后我尝试了这个: SELECT * FROM mytab

在MySQL表中,我有一个字段,包含给定记录的这个值:“190823152316”

以下是我的sql查询:

SELECT * FROM mytable WHERE 2316 IN (myfield) 
我得到了0个结果

我试过这个:

SELECT * FROM mytable WHERE 2315 IN (myfield) 
SELECT * FROM mytable WHERE 1908 IN (myfield) 
结果仍然是0

然后我尝试了这个:

SELECT * FROM mytable WHERE 2315 IN (myfield) 
SELECT * FROM mytable WHERE 1908 IN (myfield) 
令人惊讶的是,我在用1908搜索时获得了该记录!在使用2315和2316进行搜索时,我应该如何获得记录?我错过了什么


感谢

在mysql中在子句中用作

SELECT * FROM mytable WHERE column_name IN (set_of_values) ;

在mysql中提及列名而不是值

,中的
子句用作

SELECT * FROM mytable WHERE column_name IN (set_of_values) ;
提及列名而不是值

您不能在逗号分隔的编号列表上使用
IN()
,最好先规范化您的结构,现在您可以使用
find\u IN\u set
查找与逗号分隔的字符串匹配的结果

SELECT * FROM mytable WHERE find_in_set('1908',myfield) > 0
不能在逗号分隔的编号列表上使用
IN()
,最好先规范化您的结构,因为现在您可以使用
find\u IN\u set
查找与逗号分隔的字符串匹配的结果

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

SELECT * FROM mytable WHERE LOCATE(CONCAT (',', 2316 ','), CONCAT (',',myfield,',' ) ) <>0
从mytable中选择*,其中位于(CONCAT(',',2316',')、CONCAT(',',myfield,,'))0
请再试一次

SELECT * FROM mytable WHERE LOCATE(CONCAT (',', 2316 ','), CONCAT (',',myfield,',' ) ) <>0
从mytable中选择*,其中位于(CONCAT(',',2316',')、CONCAT(',',myfield,,'))0

您似乎在字段中存储逗号分隔的值。这很糟糕,糟糕,糟糕。您应该使用一个连接表,每个值一行

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

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

您似乎正在字段中存储逗号分隔的值。这很糟糕,糟糕,糟糕。您应该使用一个连接表,每个值一行

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

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

这个问题以前有人问过,也有人回答过,但我不想去寻找它;这一问题应以重复的形式结束。但是,要回答你的问题:

字符串中的逗号(列值)仅为字符。这些是绳子的一部分。它们不被视为SQL文本中值之间的“分隔符”。在SQL看来,该列只包含一个值,而不是值的“列表”

因此,在您的查询中,(字段)
中的
相当于一个equals比较。这相当于比较字符串。例如:

... WHERE 2316 = '1908,2315,2316'
... WHERE FIND_IN_SET(2316,'1908,2315,2316')
这些不相等,因此不返回行。匹配的“意外”发现,在以下情况下:

... WHERE 1908 IN ('1908,2315,2316')
这是因为该字符串是在数值上下文中计算的。也就是说,比较返回true,因为所有这些都是true:

... WHERE 1908 = '1908,2315,2316' + 0
... WHERE 1908 = '1908xyz' + 0
... WHERE 1908 = '1907qrs' + 1
(当在数值上下文中求值时,字符串将转换为数值。碰巧字符串的求值结果是一个数值,该数值等于它所比较的整数值。)


您可以使用MySQL的“在集合中查找”功能。例如:

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

但是,请认真考虑存储逗号分隔列表的设计。我推荐比尔·卡温的《SQL反模式》一书


这个问题以前有人问过,也有人回答过,但我不想去寻找它;这一问题应以重复的形式结束。但是,要回答你的问题:

字符串中的逗号(列值)仅为字符。这些是绳子的一部分。它们不被视为SQL文本中值之间的“分隔符”。在SQL看来,该列只包含一个值,而不是值的“列表”

因此,在您的查询中,(字段)
中的
相当于一个equals比较。这相当于比较字符串。例如:

... WHERE 2316 = '1908,2315,2316'
... WHERE FIND_IN_SET(2316,'1908,2315,2316')
这些不相等,因此不返回行。匹配的“意外”发现,在以下情况下:

... WHERE 1908 IN ('1908,2315,2316')
这是因为该字符串是在数值上下文中计算的。也就是说,比较返回true,因为所有这些都是true:

... WHERE 1908 = '1908,2315,2316' + 0
... WHERE 1908 = '1908xyz' + 0
... WHERE 1908 = '1907qrs' + 1
(当在数值上下文中求值时,字符串将转换为数值。碰巧字符串的求值结果是一个数值,该数值等于它所比较的整数值。)


您可以使用MySQL的“在集合中查找”功能。例如:

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

但是,请认真考虑存储逗号分隔列表的设计。我推荐比尔·卡温的《SQL反模式》一书


看看列表。在列中存储逗号分隔的列表是非常熟悉的SQL反模式。请参阅Bill Karwin的书:查看列表。在列中存储逗号分隔的列表是非常熟悉的SQL反模式。参见比尔·卡温的书: