2014-06-23 38 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

是的,现在也行得通,在我选择使用第二种解决方案之后, –