【问题标题】:select in many to many relationship在多对多关系中选择
【发布时间】:2013-03-13 14:18:48
【问题描述】:

如果我有一个可以被视为食谱数据库的数据库,我如何选择可以使用给定成分制作的食谱的所有 ID,例如,如果我有成分 1 和 4,它将返回 3是我唯一能用它做的食谱。

将有大约 50 种成分和更多食谱。

我看到了几种可能性,例如使用 UNION/多个连接,......但我没有看到解决这个问题的直接简单的解决方案。

Recipes   Recipes/Ingredients    Ingredients
   1            1  1                  1
   2            1  2                  2
   3            2  1                  3
                2  3                  4
                2  4
                3  1
                3  4

编辑/

我想到的解决方法:

select recipe_id from Recipes
where recipe_id in ( 
    select recipe_id from Recipes_Ingredients where ingredient_Id = 1
    UNION
    select recipe_id from Recipes_Ingredients where ingredient_Id = 4
)

这将导致很长的查询,因为我的数据库实际上并不是关于成分,而是关于其中可能包含 50 种或更多此类东西的东西。

【问题讨论】:

  • @Aarolama Bluenk 我已经搜索过了,我将能够用 UNION 语句解决这个问题。我认为这不是最好的解决方案,到目前为止我还没有找到更好的方法,这就是为什么我认为有这方面日常经验的人能够给出一个直截了当的答案。我不希望有查询或其他什么,只是处理此类查询的适当方法。
  • @J.Maes 在我看来,您需要展示您尝试过的内容。如果您不这样做,那么我们能做的最好的事情就是为您指明如何去做。我们不写代码。
  • @J. Maes - 你考虑过加入表格吗?

标签: sql


【解决方案1】:

试试这个(我试着猜你的列名):

表食谱:Recipe_id

表Recipes_Ingredients:食谱|成分

  SELECT Recipe_id FROM Recipes   
  EXCEPT (
    SELECT DISTINCT Recipes FROM Recipes_Ingredients
    WHERE Ingredients NOT IN (1,4)  
  )

我会解释这一点。 如果您想知道“您拥有至少一种成分的食谱”(此处:1,4):

SELECT DISTINCT Recipes FROM Recipes_Ingredients
WHERE Ingredients IN (1,4)

所以相反的是“我不能做哪个食谱”,因为你至少错过了一种成分:

SELECT DISTINCT Recipes FROM Recipes_Ingredients
WHERE Ingredients NOT IN (1,4)  

然后我们把所有的食谱都拿走,除了你不能做的食谱:

SELECT recipe_id FROM Recipes   
  EXCEPT (
    SELECT DISTINCT Recipes FROM Recipes_Ingredients
    WHERE Ingredients NOT IN (1,4)  
  )

【讨论】:

  • 这看起来很有希望,看起来正是我想要的。我现在正在测试它:)
【解决方案2】:

试试:

select recipe_id
from recipes_ingredients
group by recipe_id
having count(*)=sum(case when ingredient_id in (1,4) then 1 end)

【讨论】:

    猜你喜欢
    • 2017-09-26
    • 2018-06-25
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多