2011-11-23 113 views
0

我正在使用MySQL。在我的一个表格属性中,对于一个设备,我有一个序列号说明,如“SM,ST,SK”。MySQL搜索逗号分隔值语法

当用户输入SM或ST或SK,我想我的查询返回的结果

我当前的查询看起来像这样:

SELECT CONCAT(lvl1_id,',',lvl2_id) 
FROM hier_menus 
LEFT JOIN labels ON (hier_menus.id=label_id AND tbl=65 AND fld=2 AND lang_id=5) 
WHERE 
hm_type=13 AND lvl1_id=141 AND lvl2_id=id AND label='".addslashes($serial)."'"; 

它是唯一能够看到第一个逗号部分序列号栏。当用户输入ST时,它不会返回任何东西。

是否可以搜索整个长字符串“SM,ST,SK”以返回匹配的行?

+0

和addslashes并不能保证用户输入数据的正确转义 – ajreal

回答

0

尝试FIND_IN_SET()

SELECT ... WHERE FIND_IN_SET($serial, label) 

和ajreal真实指出,不使用和addslashes。使用mysql_real_escape_string(或任何你的数据库抽象库提供的)。 addslashes被无望破坏,并会允许某人轻松攻击您的数据库。

1
 
mysql> select find_in_set('SK', 'SM,ST,SK'); 
+-------------------------------+ 
| find_in_set('SK', 'SM,ST,SK') | 
+-------------------------------+ 
|        3 | 
+-------------------------------+ 
1 row in set (0.00 sec) 

mysql> select find_in_set('SP', 'SM,ST,SK'); 
+-------------------------------+ 
| find_in_set('SP', 'SM,ST,SK') | 
+-------------------------------+ 
|        0 | 
+-------------------------------+ 

您正在寻找FIND_IN_SET,
然而,这不是一个优化的解决方案

你应该寻求正常化您的序列号到另一个表,
其中每个SM,ST和SK是存储为一排

另一种方式是将数据类型转换为set

+0

使用find_in_set是一个很好的解决方案,但建议您将数据库标准化以提高可用性,可伸缩性和性能。 – Dubas