【问题标题】:How to query a table with a composite primary key [closed]如何使用复合主键查询表 [关闭]
【发布时间】:2018-08-01 01:45:05
【问题描述】:

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

Tables

所以有 3 张桌子,一张名为“INGREDIENTES”的桌子有配料,另一张桌子名为“RECETAS”,里面有食谱。我连接 2 个表的方式是使用名为“INGREDIENTES_RECETAS”的表,该表有一个复合主键“id_ingrediente + id_receta”,因为配方可以有一个成分数量未知。

问题是我不知道如何进行查询,通过“id_ingrediente”的多个未知 id 过滤食谱。

我在想这样的事情:

SELECT id_receta FROM INGREDIENTES_RECETAS WHERE id_ingrediente CONTAINS (89 AND 18);

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

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

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

感谢您的帮助。

【问题讨论】:

  • 这是在 Oracle 上吗?我看到你已经标记了 MySQL,但你提到不想使用 PL/SQL...
  • 我不清楚你想要达到什么目的。您是否要获取包含某些成分的食谱列表?
  • “Peter Abolins”已经回答了这个问题,感谢您的评论。我习惯用Oracle,所以我以为MySQL也有PL/SQL,我猜错了……

标签: java mysql sql database plsql


【解决方案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;

【讨论】:

  • 谢谢,这个答案也解决了我的问题,但我不习惯使用那种连接,所以我看不懂那个代码。
【解决方案2】:

假设您要查找包含所有列出的成分(可能超过 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;

【讨论】:

  • 非常感谢!!我完全忘记了“group by”和“有计数”,这太容易了……谢谢大家的快速回答!
【解决方案3】:
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); 

【讨论】:

  • 此查询显示所有包含 id 89 或 id 18 的食谱,因此它不是异或 (NOR)... id 在同一组中,例如:给我看这 2 种成分的食谱,或者什么都不给我看,但比你花时间
【解决方案4】:

您似乎想要一个id_receta 列表,其中id_ingrediente 与给定的ID 列表匹配。这可以通过。

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

【讨论】:

  • 此查询显示所有包含 id 89 或 id 18 的食谱,因此它不是异或 (NOR)...但是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多