使用MySQL匹配子表中的多行

时间:2014-06-23 07:45:14

标签: mysql sql

我有一个名为Product的表,以及一个名为ProductProperty的子表:

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

因此,产品可以有多个相应的ProductProperty行。

现在我想查询以下内容:'选择属性width = 12和height = 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);

我在这里缺少哪些明显更好的实现?

1 个答案:

答案 0 :(得分: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;