2011-05-20 40 views
1

Basicly我在我的表中的一行,具有如下格式爲它的價值 - 1,2,3,4,10,11,21,34等。MySQL的LIKE限制

我檢索與LIKE語句值,但因爲我使用它與%<value>% ,當搜索1時,它返回11,21,1等等。

我該如何限制它,以基於一個返回值?

+0

是強制要求的情況下使用喜歡? – PachinSV 2011-05-20 17:16:44

回答

3

相反的col LIKE '%<value>%'

col LIKE '%,<value>,%' OR col LIKE '<value>,%' OR col LIKE '%,<value>' OR col LIKE '<value>' 

或更好,但

col REGEXP '(.+,|^)<val>(,.+|$)' 

但是,最好的解決辦法是改變你的數據結構!請使用SET類型或多個字段或連接表。

+3

+1改變數據結構 - 每個單元格應該只包含一個值(1NF),那麼你就不會有像這樣的問題 – tomfumb 2011-05-20 17:28:00

+0

謝謝,我們將研究'SET'數據類型,因爲'LIKE x OR x'是有點矯枉過正......也許,不僅僅是一點點。 – jolt 2011-05-20 17:35:27

+2

最終'like'可能只是「或col = value」,因爲在匹配值中沒有通配符。 – 2011-05-20 17:58:14

6

嘗試find_in_set()字符串函數:

SELECT ... 
FROM ... 
WHERE FIND_IN_SET(somevalue, '1,2,3,4,10'); 

注意,這是一個純粹的MySQL的功能,而不是其他任何地方,而無需通過鉅額跳火圈。

1

如果只想返回特定的匹配項,則使用=而不是LIKE。 like是爲了返回部分匹配,不像=只返回特定的匹配。如果你只是想匹配第一部分,使用%,但11仍然會返回111,但不是211.一個常見的錯誤是使用LIKE的一切,或刪除%%等。另外,你真的認爲你的MYSQL數據庫中的行的值是1,2,3,4,11,12等嗎?如果是這樣,你爲什麼試圖根據其中的數字來搜索該值?我想你會尋找整體的一個子集,如%3,4,11%等...

1

雖然我同意其他答案有關更改您的數據結構,您遇到的問題可以通過將您的串行數據字段中的每個值都用分隔符進行封裝,可以輕鬆修復。

I don't recommend it,但如果你從1,2,3,4,10,11,21,34改變你的數據,1,2,3,4,10,11,21,34,,你會注意到,每個值標註在兩側用逗號,所以你現在可以搜索%,<value>,%

+0

+1,喜歡哈克的方式。 – jolt 2011-05-20 17:38:59

+0

分隔符不是hacky,而是序列值字段。 – horatio 2011-05-20 17:40:37