2015-07-12 38 views
-3

與現場CATEGORY_ID(表productoption)比較數字我有3個表:如何在MYSQL

產品

id name 
1 ABC 
2 ABCDC 
3 ABEFC 

類別

id name 
1 Cate 1 
2 Cate 2 
3 Cate 3 

ProductOption

id product_id size  category_id 
1 1   25,26,27 1,2 
2 2   25,26,27 1,2 
3 3   25,26,27 3 

如何選擇由輸入類別產物是1 =>數據PRODUCT_ID結果:1,2

+1

查看標準化 – Strawberry

+1

在'ProductOption'表中,您存儲逗號分隔的字符串,如'25,26,27''和'1,2''?這是一個可怕的模式,正如@Strawberry試圖說的那樣。而不是試圖解決這個問題,設計一個更好的模式來存儲你的數據,這樣你就可以編寫合理的SQL查詢。 –

+0

你已經遇到了我們不喜歡的列表人士Tap – Drew

回答

0

不能使用的操作者IN此。
原因是IN運算符需要一個值列表,但是您提供的單個值包含一個列表。這是一個常犯的錯誤,我自己做了幾次,所以不要爲此感到不快。

您應該規範化您的表 - 在單個列中保留多個值在99.9999999999999%的案例中是錯誤的。
通過規範化我的意思是你應該增加2個表:ProductOptionSizeProductOptionCategory,並用它們爲許多的ProductOptionSizeCategory表之間一對多的關係。

如果你因爲某些原因無法正常化你的表,你可以使用LIKE操作員選擇的所有產品類別,像這樣:

SELECT p.id, p.name 
FROM Product p 
INNER JOIN ProductOption po ON(p.id = po.id) 
WHERE CONCAT(','m po.category_id, ',') like '%,1,%' 

注:我以前用過,並在值後確保只得到類別1的結果,而不是11,123等。另外,我在category_id的開始和結尾處添加了一個,,以獲得值爲1的結果。 category_id值列表的開始或結束。