2014-06-20 3 views
0

У меня начинается головная боль, выбирая/поиск, чтобы выбрать все блюда, которые соответствуют некоторому списку ингредиентов.SQL выберите все блюда, соответствующие критериям ингредиентов

Моих столы:

Ingredients 
============ 
ID 
IngredientName 
IngredientAmount 
P_ID 


Dishes 
========== 
ID 
DishName 


DishIngredients 
========== 
ID 
DishID 
IngredeientID 
IngredientAmount 

Имея то есть два ингредиент имен, я хочу, чтобы выбрать все блюда (так что я хочу знать их P_ID's) Я могу сделать из него (там будет много блюд с подмножеством дается то есть 5 ингредиентов)

до этого момента мы следующие:.

SELECT d.Name, i.IngredientName, di.IngredientAmount 
FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishId = di.DishId 
INNER JOIN Ingredients AS i ON di.IngredientId = i.ID 
WHERE i.IngredientName IN ('salt','tomato') 

Хотя это покажет блюда, которые требуют «помидор», но требуют о эти ингредиенты, которые у нас нет в списке.

+0

Можете ли вы рассказать о структуре своего тарелки? – Mureinik

+0

Привет, мог бы показать структуру таблицы «блюда». – Haris

+0

Конечно, вот оно. – NightSnail

ответ

0

Что я хотел бы сделать, это создать еще одну таблицу DishIngredients, с колоннами DishIngredientId, DishId, IngredientId и двигаться IngredientAmount к этой таблице.
Потому что, например, у нескольких блюд может быть помидор как ингредиент, но с разным количеством.

Затем соединить эти три таблицы, чтобы выяснить, какие блюда имеют помидора как-то ингредиент, как это:

SELECT d.Name, i.IngredientName, di.IngredientAmount 
FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishId = di.DishId 
INNER JOIN Ingredients AS i ON di.IngredientId = i.IngredientId 
WHERE i.IngredientName = 'Tomato' 

(А если вы хотите найти более чем одного ингредиента, используйте предложение IN, так же, как вы уже сделали)

Я перечитал вас вопрос, и, возможно, это то, что вы имеете в виду (любой ингредиент):

SELECT DISTINCT d.DishName 
FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishID = di.DishID 
WHERE di.IngredientID IN (SELECT i.IngredientID 
FROM Ingredients AS i WHERE i.IngredientName IN ('Tomato', 'Cheese')) 

в нем перечислены все безрезультатно способные блюда с томатом и сыром в качестве ингредиентов.
Смотрите также это SQL Fiddle

Если вы хотите, чтобы все ингредиенты, попробуйте следующее:

SELECT d.DishName, A.IngredientName, B.IngredientName 
FROM Dishes AS d 
CROSS APPLY (SELECT di.DishIngredientID, i.IngredientName FROM DishIngredients AS di 
    INNER JOIN Ingredients AS i ON di.IngredientID = i.IngredientID AND i.IngredientName = 'Cheese' 
    WHERE d.DishID = di.DishID) AS A 
CROSS APPLY (SELECT di.DishIngredientID, i.IngredientName FROM DishIngredients AS di 
    INNER JOIN Ingredients AS i ON di.IngredientID = i.IngredientID AND i.IngredientName = 'Tomato' 
    WHERE d.DishID = di.DishID) AS B 

Для каждого дополнительного ингредиента, добавьте еще один CROSS APPLY.

+0

Хорошо, я перестроил свою БД с вашими предложениями, хотя моему MySQL не нравится ваш синтаксис: 'AS i ON di.IngredientId ON i.IngredientId' - второй' ON' является неожиданным. – NightSnail

+0

Я отредактировал следующий запрос: 'SELECT d.Name, i.IngredientName, di.IngredientAmount FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishId = di.DishId INNER JOIN Ингредиенты AS i ON di.IngredientId = i.IngredientId ГДЕ i.IngredientName IN ('spaghetti', 'tomato') 'однако это не делает работу, потому что она показывает блюда, содержащие томат, но одно и то же блюдо требует других ингредиентов, которые не предусмотрены. – NightSnail

+0

Извините, второй 'ON' был опечаткой, это действительно должно быть' = '. Вы можете играть с добавлением ингредиентов с помощью конструкций 'AND' и' OR'. Я буду обновлять запрос, чтобы это отразить. – CoolWilly

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