2014-06-23 39 views
0

我有一個名爲產品表,並呼籲ProductProperty子表:匹配在子表多行與MySQL

Product(Product_id, productName,...) 
ProductProperty(id, propertyKey, propertyValue, Product_id) 

因此,一個產品可以有多個相應ProductProperty行。

現在我想查詢一些內容:'選擇所有產品行的屬性寬度= 12和高度= 35'。對於這個特定的例子,我提出了以下查詢,該查詢可行,但我覺得我可能缺少一個好的解決方案。

SELECT Product.Product_id from Product 
WHERE 
    EXISTS (SELECT * FROM ProductProperty WHERE propertyKey='width' AND propertyValue='12' AND ProductProperty.Product_id = Product.Product_id) 
    AND 
    EXISTS (SELECT * FROM ProductProperty WHERE propertyKey='height' AND propertyValue='35' AND ProductProperty.Product_id = Product.Product_id); 

有沒有明顯更好的實現,我在這裏失蹤?

回答

2

如何:

SELECT p.Product_id 
    FROM Product p 
    JOIN ProductProperty pp ON p.Product_id = pp.Product_id 
WHERE (pp.propertyKey = 'width' AND pp.propertyValue = '12') 
    OR (pp.propertyKey = 'height' AND pp.propertyValue = '35') 
GROUP BY p.Product_id 
HAVING COUNT(*) = 2; 

這當然假定一個產品不能有重複鍵。如果可能的話,你可以試試這個:

SELECT p.Product_id 
    FROM Product p 
    JOIN ProductProperty pp ON p.Product_id = pp.Product_id 
GROUP BY p.Product_id 
HAVING SUM(pp.propertyKey = 'width' AND pp.propertyValue = '12') > 0 
    AND SUM(pp.propertyKey = 'height' AND pp.propertyValue = '35') > 0; 
+0

謝謝。最後一個似乎沒有給出正確答案,但第一個查詢是我要使用的,謝謝。 –

+0

我編輯了我的答案。第二個應該現在工作。 – shmosel

+0

是的,現在也行得通,在我選擇使用第二種解決方案之後, –