我需要一个棘手的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)
此查询必须快速,因为数据库将包含大量产品。
因此,如果可能的话,我并不热衷于计算,因为我相信这会减慢它的速度。
感谢。
答案 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
保存在那里。对于这种情况,它将是一个简单的选择而不加入。