2011-11-23 108 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