我正在使用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”以返回匹配的行?
答案 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)
SELECT ... WHERE FIND_IN_SET($serial, label)
正如ajreal指出的那样,不要使用addslashes。使用mysql_real_escape_string(或您的DB抽象库提供的任何内容)。 addslashes无可救药地破坏了,并且允许某人轻松攻击您的数据库。