Как запросить таблицу с составным первичным ключом

0

Привет (я нооб в этой области), у меня есть база данных 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
    Это на Oracle? Я вижу, у вас есть теги MySQL, но вы упоминаете, что не хотите использовать PL / SQL ...
  • 0
    Мне неясно, чего вы пытаетесь достичь. Вы пытаетесь получить список рецептов с определенными ингредиентами?
Показать ещё 1 комментарий
Теги:
database
plsql

4 ответа

0
Лучший ответ

Предполагая, что вы хотите найти все рецепты, содержащие все перечисленные ингредиенты (возможно, более 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;
  • 1
    Огромное спасибо!! Я полностью забыл про « группировать по » и « иметь счет », это было так легко ... Спасибо всем за быстрые ответы !! <3
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;
  • 0
    Спасибо, этот ответ также решает мою проблему, но я не привык использовать такого рода объединения, поэтому я не могу понять этот код.
0

Похоже, вам нужен список id_receta где id_ingrediente соответствует указанному списку идентификаторов. Это может быть достигнуто с помощью.

SELECT
   'id_receta'
FROM
    'ingredients_recetas'
WHERE
    'id_ingrediente' IN (89, 18);
  • 0
    Этот запрос показывает все рецепты, которые содержат либо идентификатор 89 или идентификатор 18, так что это не исключительное ИЛИ (NOR) ... Но спасибо
0
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); 
  • 0
    Этот запрос показывает все рецепты, которые содержат либо идентификатор 89, либо идентификатор 18, так что это не исключающее ИЛИ (NOR) ... Я имею в виду, что вы берете каждое приложение с идентификатором, когда я пытаюсь взять каждый идентификатор в одной группе, например: show мне рецепт с этими 2 ингредиентами или покажи мне ничего, кроме тебя как для своего времени

Ещё вопросы

Сообщество Overcoder
Наверх
Меню