2014-02-07 2 views
0

Я пытаюсь создать запрос поиска рецепта, который возвращает рецепты, которые могут быть сделаны с использованием только тех ингредиентов, которые уже есть у пользователя. Например, если у пользователя есть лук, помидоры, молоко, салат, шоколадный сироп и т. Д., То запрос должен содержать рецепты, такие как салат (лук, помидор, салат), шоколадное молоко (молоко, шоколадный сироп) и т. Д.SQL-поиск для всех подмножеств

Прямо сейчас у меня есть таблица, называемая рецептами с идентификаторами столбцов (первичный ключ) и ингредиентами. У меня есть другая таблица с именем user_ingredients с идентификаторами столбцов и ингредиентом.

Как выглядит эффективный SQL-запрос? В терминах теории множеств я знаю, что мне нужны все рецепты, где набор ингредиентов содержится в наборе пользовательских ингредиентов. Я просто не знаю, как перевести это на SQL, так как я немного новичок в SQL.

Кроме того, если вы считаете, что моя структура базы данных не является тем, чем она должна быть, не стесняйтесь рекомендовать что-то лучше!

+1

Что-то вроде http://stackoverflow.com/questions/20007709/how-to- make-a-query-to-display/20007818 # 20007818 или http://stackoverflow.com/questions/20007709/how-to-make-a-query-to-display/20007818#20007818? Если вы ищете SO для вопросов о рецептах, вы, вероятно, найдете много подобных. – Barmar

+0

Пожалуйста, отметьте свой вопрос с помощью конкретной базы данных, которую вы используете: mysql, sql-server, oracle и т. Д. – Barmar

+0

Если вы уже знаете теорию множеств, тогда вы должны понимать SQL, потому что он использует те же понятия http://en.wikipedia.org/вики/Set_operations_ (SQL) – jbaliuka

ответ

0

Как вы храните несколько ингредиентов в столбце recipes.ingredients? У вас должна быть другая таблица для этого - recipe_ingredients с одной строкой на каждый ингредиент каждого рецепта.

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

SELECT recipe_id 
    FROM recipe_ingredients ri 
    LEFT JOIN (SELECT * 
       FROM user_ingredients 
       WHERE user_id = 1) ui ON (ui.ingredient = ri.ingredient) 
GROUP BY recipe_id 
HAVING SUM(case when user_id is null then 1 else 0 end) = 0; 

Отъезд SQL Fiddle

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