在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搜索时,我该怎么做才能获得记录?我错过了什么?
由于
答案 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