поиск в совместных таблицах - PullRequest
1 голос
/ 30 июля 2010

У меня есть четыре таблицы:

cuisines(id, name);

recipes(id, cuisine_id, name, picture);

ingredients(id, name);

ingredients_recipes(ingredient_id, recipe_id);

последняя таблица ссылается на отношение «многие ко многим» между рецептами и ингредиентами. Как выбрать все кухни, в которых есть помидоры (то есть в кухне есть рецепты, в которых есть ингредиенты, которые называются «помидорами»)?

Я использую это в SQLite, но думаю, что это одинаково во всех языках SQL?

Ответы [ 5 ]

3 голосов
/ 30 июля 2010

Вы можете попробовать INNER JOIN во всех четырех таблицах, как в следующем примере:

SELECT      DISTINCT c.name
FROM        cuisines AS c
INNER JOIN  recipes AS r ON (r.cuisine_id = c.id)
INNER JOIN  ingredients_recipes AS ir ON (ir.recipe_id = r.id)
INNER JOIN  ingredients AS i ON (i.id = ir.ingredient_id)
WHERE       i.name = 'tomatoes';
0 голосов
/ 30 июля 2010

СУЩЕСТВУЕТ вариант:

SELECT name
FROM cuisines c
WHERE EXISTS
(   SELECT NULL 
    FROM recipes r 
    JOIN ingredients_recipes ir ON r.id = ir.recipe_id
    JOIN ingredients i ON ir.ingredient_id = i.id and i.name = 'tomatoes'
    WHERE r.cuisine_id = c.id
)
0 голосов
/ 30 июля 2010

Я бы предложил использовать подзапросы вместо объединений. Что-то вроде ...

SELECT *
    FROM cuisine
    WHERE cuisine_id IN (
             SELECT cuisine_id
                 FROM recipe
                 WHERE recipe_id IN (
                         SELECT recipe_id
                             FROM recipe_ingredients
                             WHERE ingredient_id IN (
                                        SELECT id
                                        FROM ingredients
                                        WHERE TOUPPER(name) LIKE '%TOMATO%')));

В любом случае, я думаю, вы должны быть осторожны с соответствием на слове; больше, чем другие корреспонденты, так как вы не хотите пропустить такие ингредиенты, как «Четыре маленьких помидора», «Один большой помидор» или «Томатное пюре».

0 голосов
/ 30 июля 2010

Вариант подзапроса:

SELECT name
FROM cuisines
WHERE id IN (
    SELECT cuisine_id 
    FROM recipes r 
    JOIN ingredients_recipes ir ON r.id = ir.recipe_id
    JOIN ingredients i ON ir.ingredient_id = i.id
    WHERE i.name = 'Tomatoes'
)
0 голосов
/ 30 июля 2010

Присоединяйтесь к ним по внешним ключам, фильтр по component_name = 'Tomatoe', группируйте по всем интересующим вас столбцам таблицы кухонь.

SELECT cuisine.id, cuisine.name
  FROM cuisine
  INNER JOIN recipe on recipe.cuisine_id = cuisine.id
  INNER JOIN ingredients_recipes ir ON ir.recipe_id = recipe.id
  INNER JOIN ingredients on ingredients.id = ir.ingredient_id
  WHERE ingredients.name = 'Tomatoe'
  GROUP BY cuisine.id, cuisine.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...