2012-01-15 111 views
1

我有一個存儲產品的數據庫表。每個產品可以有多種顏色。每個顏色由它的ID,而不是文本描述,如「紅色」,「黃色」等。當$_POST['colour']陣列內裂爲一個字符串(由逗號分隔)表示則存儲在表中:MySQL WHERE子句和分隔字符串的問題

product_id | colour 
---------------------- 
1   | 1,2 
2   | 10 
3   | 7,9 

最近我嘗試創建一個搜索表單,它可以選擇多種顏色並搜索數據庫表,以查看是否有任何產品至少包含搜索數組中的一種顏色。因此,如果訪問者想要查看顏色1和9的產品,則需要在「顏色」列中搜索這兩個值。

我不能使用WHERE colour IN (1,9),因爲我認爲只有當列中有一個值(而不是多個值的分隔數組)時纔有效。我也不能使用WHERE colour LIKE 1 OR WHERE colour LIKE 9,因爲它會返回顏色ID爲10或11或12等的產品。

有誰知道我該如何做到這一點?

+1

[一個陣列內的mysql選擇查詢(可能重複http://stackoverflow.com/questions/8840232/mysql-select-query-within -a-array) – Wrikken 2012-01-15 01:45:19

+2

[在數據庫列中存儲逗號分隔列表真的很糟糕嗎?](http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a -database-column-really-that-bad) – 2012-01-15 01:45:20

+0

顏色列的定義是什麼? – 2012-01-15 01:45:35

回答

4

如果要獲得良好的性能,需要對此表進行標準化,創建一個productColor表,並與產品表建立一對多關係。

這就是說:

SELECT * 
FROM Product 
WHERE Colour LIKE '%,1,%' OR Colour LIKE '1,% OR COLOUR LIKE '%,1' 
    OR Colour LIKE '%,9,%' OR Colour LIKE '9,% OR COLOUR LIKE '%,9' 
+1

+1只是強調了這個表*真正*需要的點標準化。 – 2012-01-15 01:49:30

+0

謝謝 - 我已經規範了表格,並重構了我的代碼:) – hohner 2012-01-15 02:08:55

+0

@Jamie很高興聽到 – 2012-01-15 02:24:50

1

產品和顏色創建的關聯表,而不是在單個列中存儲多個瓦萊斯。就像山坳的productId參數和colorId assocProductsColors包括標識山坳爲表

1

你已經擁有了類似意見的關鍵,我建議修改你的數據庫有:

product_id | colour 
---------------------- 
1   | 1 
1   | 2 
2   | 10 
3   | 7 
3   | 9 

但是,也可以使用MySQL Regex Operators,特別是RLIKE(「正則表達式」)來做到這一點。

SELECT * 
FROM Product 
WHERE Colour RLIKE '[[:<:]][19][[:>:]]' 

正則表達式[[:<:]][19][[:>:]]指 「匹配1或9([19]),其中,它是一個整個單詞」。 [[:<:]][[:>:]]的意思是「單詞邊界」,所以給定的模式只能匹配1或9,如果它是整個單詞,而不是它是另一個數字的一​​部分。

2

標準化表格。

在此同時,您可以使用:

SELECT * 
FROM Product 
WHERE FIND_IN_SET(1, Colour) 
    OR FIND_IN_SET(9, Colour)   --- etc