如何使用复合主键查询表

时间:2018-02-21 12:59:17

标签: java mysql sql database plsql

你好(我是这个领域的菜鸟),我有一个MySQL数据库,它有下一个表:

Tables

所以有3个表,一个名为" INGREDIENTES "有成分和另一个称为" 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驱动程序?

感谢您的帮助。

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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); 

答案 2 :(得分:0)

看起来您需要一个id_receta列表,其中id_ingrediente与给定的ID列表匹配。这可以通过。

完成
SELECT
   `id_receta`
FROM
    `ingredients_recetas`
WHERE
    `id_ingrediente` IN (89, 18);

答案 3 :(得分:0)

假设您要查找包含所有列出的成分(可能超过2个)的所有食谱,那么您可以执行以下操作。请注意,HAVING子句应与要检查的成分数进行比较,IN子句应包含所有成分的ID。

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;