首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用复合主键查询表

如何使用复合主键查询表
EN

Stack Overflow用户
提问于 2018-02-21 12:59:17
回答 4查看 875关注 0票数 0

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

表格

所以有三个表,一个叫"INGREDIENTES“,里面有配料,另一个叫"RECETAS”,里面有食谱。我连接这两个表的方式是使用一个名为"INGREDIENTES_RECETAS",的表--这个表有一个复合主键"id_ingrediente + id_receta",因为一个菜谱可能有数目未知的成分。

问题是,我不知道如何通过许多未知的"id_ingrediente“ids过滤菜谱。

我在想这样的事情:

代码语言:javascript
复制
SELECT id_receta FROM INGREDIENTES_RECETAS WHERE id_ingrediente CONTAINS (89 AND 18);

我想解决这个问题,避免使用PL/ SQL,只使用SQL。有可能吗?

我在一个java应用程序中使用这个程序,所以如果有一种编程的方法,它也会解决这个问题。

如果我必须使用PL/SQL,如何使用jdbc驱动程序在java中调用“过程”?

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-21 14:01:50

假设你想找到所有的食谱,其中包含所有列出的成分(可能超过2),那么你可以做以下工作。请注意,应该将HAVING子句与正在检查的成分数量进行比较,而IN子句应该包含所有成分的id。

代码语言:javascript
复制
SELECT 
    ir.id_receta
FROM 
    INGREDIENTES_RECETAS ir
WHERE 
    ir.id_ingrediente IN (89, 18)
GROUP BY 
    ir.id_receta
HAVING 
    COUNT(*) = 2;

编辑

如果您想找到至少有一种列出成分的所有菜谱,请将最后一句改为:

代码语言:javascript
复制
HAVING 
    COUNT(*) > 0;

还有..。虽然这里的一些其他解决方案以不同的方式提供了这一点,但是要找到所有的菜谱都有所列的成分,请将最后一条修改为:

代码语言:javascript
复制
HAVING 
    COUNT(*) = 1;
票数 0
EN

Stack Overflow用户

发布于 2018-02-21 13:08:41

如果您正在寻找同时包含成分89和18的菜谱,那么将INGREDIENTES_RECETAS与其自身结合,形成可以过滤的成分对:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-02-21 13:04:42

代码语言:javascript
复制
SELECT id_receta FROM INGREDIENTES_RECETAS WHERE id_ingrediente IN (89, 18); 

代码语言:javascript
复制
SELECT id_receta FROM INGREDIENTES_RECETAS WHERE (id_ingrediente = 89) OR (id_ingrediente = 18); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48906568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档