Привет (я нооб в этой области), у меня есть база данных MySQL, и у нее есть следующие таблицы:
Таким образом, есть 3 таблицы, одна из которых называется " ИНГРЕДИЕНТЫ ", в которой есть ингредиенты, а другая - " RECETAS ", в которой есть рецепты. То, как я соединяю 2 таблицы, - это таблица с именем " INGREDIENTES_RECETAS ", эта таблица имеет составной первичный ключ "id_ingrediente + id_receta", потому что рецепт может содержать неизвестное количество ингредиентов.
Проблема в том, что я не могу понять, как сделать запрос, который фильтрует рецепт рядом неизвестных идентификаторов "id_ingrediente".
Я думал о чем-то вроде:
SELECT id_receta FROM INGREDIENTES_RECETAS WHERE id_ingrediente CONTAINS (89 AND 18);
Я хотел бы решить эту проблему, избегая PL/SQL, используя только SQL. Является ли это возможным?
Я использую это в приложении java, поэтому, если есть способ его программного решения, он также решит проблему.
Если мне нужно использовать PL/SQL, как я могу вызвать "процедуру" в java, используя драйвер jdbc?
Спасибо за помощь.
Предполагая, что вы хотите найти все рецепты, содержащие все перечисленные ингредиенты (возможно, более 2), вы можете сделать следующее. Обратите внимание, что предложение HAVING
следует сравнивать с количеством проверяемых ингредиентов, а предложение IN
должно содержать весь идентификатор ингредиентов.
SELECT
ir.id_receta
FROM
INGREDIENTES_RECETAS ir
WHERE
ir.id_ingrediente IN (89, 18)
GROUP BY
ir.id_receta
HAVING
COUNT(*) = 2;
РЕДАКТИРОВАТЬ
Если вы хотите найти все рецепты, содержащие хотя бы один из перечисленных ингредиентов, измените последнее предложение на:
HAVING
COUNT(*) > 0;
И... в то время как некоторые из других решений здесь предоставляют это по-другому, чтобы найти все рецепты, которые имеют только один из перечисленных ингредиентов, измените последнее предложение на:
HAVING
COUNT(*) = 1;
Если вы ищете рецепты, содержащие оба ингредиента 89 и 18, присоединитесь к INGREDIENTES_RECETAS
с собой, чтобы сформировать пары ингредиентов, на которые вы можете фильтровать:
SELECT ir1.id_receta
FROM INGREDIENTES_RECETAS ir1
INNER JOIN INGREDIENTES_RECETAS ir2 ON ir1.id_receta = ir2.id_receta
WHERE ir1.id_ingrediente = 89 AND ir2.id_ingrediente = 18;
Похоже, вам нужен список id_receta
где id_ingrediente
соответствует указанному списку идентификаторов. Это может быть достигнуто с помощью.
SELECT
'id_receta'
FROM
'ingredients_recetas'
WHERE
'id_ingrediente' IN (89, 18);
SELECT id_receta FROM INGREDIENTES_RECETAS WHERE id_ingrediente IN (89, 18);
или же
SELECT id_receta FROM INGREDIENTES_RECETAS WHERE (id_ingrediente = 89) OR (id_ingrediente = 18);