2011-10-28 23 views
0

我想使用IN命令在字段中查找所有出现的字符串,但是当我知道应该有一些时没有返回任何结果。 我想向您展示通过实例的最佳方式:错误地使用'IN'?

mysql> SELECT detail_sections FROM inet_staff_details WHERE detail_sections !=''; 
+-----------------+ 
| detail_sections | 
+-----------------+ 
| 10,11   | 
| 10,11   | 
| 10,11   | 
| 10,11   | 
+-----------------+ 
4 rows in set (0.00 sec) 

mysql> SELECT * FROM inet_staff_details WHERE 11 IN (detail_sections); 
Empty set, 4 warnings (0.00 sec) 

mysql> SELECT * FROM inet_staff_details WHERE '11' IN (detail_sections); 
Empty set (0.00 sec) 

正如你所看到的,11号是在逗号分隔的列表,但结果显示不出来。请你能告诉我我做错了什么?

干杯。

回答

0

试试这个:

SELECT * FROM inet_staff_details 
WHERE detail_sections LIKE '%,11,%' 
OR detail_sections LIKE '%,11' 
OR detail_sections LIKE '11,%' 
OR detail_sections = '11' 
2

在做什么,是看是否有列中的任何值(在这种情况下detail_sections),这等于规定值(在这种情况下11)。

您应该使用LIKE来获取所需的值。

SELECT * FROM inet_staff_details 
WHERE detail_sections LIKE '11,%' 
    OR detail_sections LIKE '%,11' 
    OR detail_sections LIKE '%,11,%' 
    OR detail_sections = '11'; 
+0

-1,因为这将挑出113,411,51124等 – Brian

+0

@布莱恩真实的,但它是一个例子。查询将不得不基于值进行修改,但是是的,我可以修改查询不选择113,411,51124等。 –

0

事情是这样的:

select * from inet_staff_details 
    where instr(concat(',', detail_sections, ','), ',11,') > 0 
1

呀IN不会为你在这里工作。 IN旨在挑选出完整的值,而不是基本上是你在这里得到的子字符串。你的问题是,这是一个基本上有缺陷的数据库设计,这使得搜索诸如11的特定值非常困难。

您的选择是

(一)重新设计了一下(正常化数据库和连接表读了),或

(b)搜查其中:detail_sections = '11' or detail_sectoins LIKE '11,%' or detail_sections LIKE '%,11,%' or detail_sections LIKE '%,11'

+0

同意它不是最好的设计。不知道我在几个月前的想法,但我在紧张的时间表,所以现在需要做一个快速修复! – scampbell