2013-05-22 33 views
0

我有一個問題,使用LIKE子句的SELECT查詢。我需要在一個特定字段中獲取具有類別ID的所有記錄。所有的分類ID都是這樣存儲的:MySQL選擇在哪裏,但只有一個數字

1; 2; 4; 11; 12; 22; 32;

正在發生的事情是,下面的查詢

SELECT * FROM mytable WHERE catids LIKE '%2;%'

將選擇所有具有類別ID 2,但也記錄類別12,22,32等。不幸的是,用於存儲類別ID的代碼是不可修改的,並且數字2是從變量中讀取的。 我試着在它旁邊使用NOT LIKE子句,但爲了避免12,22,32,42等,我不能重複10次......

有沒有人知道一種方法來告訴子句LIKE來獲取任何東西與%可以是空的或;但不是一個數字?因爲如果在上面的示例中要獲取的類別ID是1,那麼字符串將以數字1開頭(所以它不會在左邊),但它也會獲取11。

謝謝

+0

你可以存儲數據; 1; 2; 4; 11; 12 ; 22; 32;在啓動時添加額外的分隔符並將查詢更改爲LIKE'%; 2;% – Strik3r

+0

爲什麼數據庫的設計方式使得它可以使用任何可能的東西? –

+0

您最好重新整理您的表格以擺脫一個字段中的存儲值。 – Heavy

回答

3

的妥善解決是重新設計你的表,規範這一領域,所以你存儲這些ID在一個子表,每記錄一個ID。那麼你的問題就會消失。

如果做不到這一點,你需要一個醜陋的WHERE子句來處理所有可能的情況:

WHERE 
     catids = 2    // the only ID in the field 
    OR catids LIKE '2;%'  // ID is at the START of the id list 
    OR catids LIKE '%;2;%' // ID is somewhere in the MIDDLE of the list 
    OR catids LIKE '%;2'  // ID is at the END of the list 

如果你有一個正確的標準化設計,該條款將僅僅是

WHERE subtable.catids = 2 
+0

謝謝。這將工作。我知道這是一個非常醜陋的WHERE子句,但這就是代碼是如何改變的! –

0

我第二(和第三)你需要重新設計你的表的想法。這就是說,你也可以做這樣的事情:

WHERE CONCAT(';', catids, ';') LIKE '%;2;%' 
0

嘗試使用REGEXP ...喜歡的東西...

SELECT * FROM mytable WHERE catids REGEXP '(\d|;|^)2;'