2015-02-03 5 views
2

Мне нужна помощь с сложным запросом 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 возможных продукта на выбор: «Счета Удивительный Кетчуп» и «Вкусный кетчуп Мэри».

Каждый продукт будет иметь свои собственные диетические красные флаги. Например, Умеренный кетчуп Учета содержит Клейковину и Яйцо, тогда как Мэри Вкусный Кетчуп содержит только глютен, но НЕ яйцо.

Что я хочу сделать, так как против Ингредиента отображаются только красные флаги, которые применимы.

Например, два продукта содержат глютен и только 1 содержит яйцо. Таким образом, яйцо НЕ является красным флагом для ингредиента Кетчупа, потому что продукт, который не содержит яйца, существует, и клиент может купить альтернативу без яиц, поэтому яйцо НЕ должно быть показано как красный флаг против ингредиента.

Однако, поскольку оба продукта содержат клейковину, и нет альтернативы без глютена, поэтому ингредиент должен показывать клейковину как красный флаг.

кетчуп ингредиент должен поэтому показать следующие данные, относящиеся к:

 
IngredientID | RedFlagID 
1   | 1 (Gluten) 

Этот запрос должен быть быстрым, потому что база данных будет содержать много продуктов.

Так что я не заинтересован в том, чтобы иметь счет, если это возможно, так как я считаю, что это замедлит его.

Спасибо.

ответ

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 там. Для этого случая это будет простой выбор без присоединения.

Смежные вопросы