MySQL选择子记录,其中所有父记录具有相同的子记录,排除所有其他子记录

时间:2015-02-03 05:18:44

标签: mysql

我需要一个棘手的MySQL查询帮助。

这些是表格和数据:

成分

IngredientID  | Name
1             | Ketchup


产品

ProductID | Name                  | IngredientID
1         | Bills Amazing Ketchup | 1
2         | Marys Tasty Ketchup   | 1


RedFlags

ProductID | RedFlagID
1         | 1 (Gluten)
1         | 2 (Egg)
2         | 1 (Gluten)


烹饪原料可以有多种产品。例如,番茄酱的成分可以在商店中选择不同类型的番茄酱。

在这种情况下,番茄酱有2种可供选择的产品,'Bills Amazing Ketchup'和'Marys Tasty Ketchup'。

每种产品都有自己的饮食危险信号。例如Bills Amazing Ketchup包含面筋和鸡蛋,而Marys Tasty Ketchup只含有麸质但没有鸡蛋。

我想要做的是,针对成分只显示适用的红旗。

例如,这两种产品都含有麸质,只有1种含有鸡蛋。所以鸡蛋不是番茄酱成分的红旗,因为不含鸡蛋的产品存在且顾客可以购买不含鸡蛋的替代品,因此鸡蛋不得作为红色标志显示该成分。

然而,由于这两种产品都含有麸质,并且没有可供选择的无麸质替代品,因此该成分必须将麸质显示为红旗。

番茄酱成分应该显示以下相关数据:

IngredientID | RedFlagID 
1            | 1 (Gluten)

此查询必须快速,因为数据库将包含大量产品。

因此,如果可能的话,我并不热衷于计算,因为我相信这会减慢它的速度。

感谢。

1 个答案:

答案 0 :(得分:0)

SELECT count(crf.RedFlagID) as cnt, crf.RedFlagID 
   FROM RedFlags as crf
   LEFT JOIN Products as p USING(ProductID)
   WHERE IngredientID = :ingId
   GROUP BY p.ProductID
   ORDER BY cnt DESC
   LIMIT 1

或者,您可以对表RedFlags进行非规范化以将IngredientID保存在那里。对于这种情况,它将是一个简单的选择而不加入。