MySQL搜索逗号分隔值语法

时间:2011-11-23 16:21:47

标签: mysql conditional-statements

我正在使用MySQL。在我的一个表属性中,我有一个设备的序列号描述,如“SM,ST,SK”。

当用户输入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”以返回匹配的行?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试FIND_IN_SET()

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

正如ajreal指出的那样,不要使用addslashes。使用mysql_real_escape_string(或您的DB抽象库提供的任何内容)。 addslashes无可救药地破坏了,并且允许某人轻松攻击您的数据库。