在联接表中仅查找完全匹配项

Find only complete match in join table

提问人:loic.k 提问时间:10/27/2022 更新时间:10/27/2022 访问量:38

问:

我有 3 张桌子,Pizza、Ingredient 和 PizzaIngredients,这是我的前两张桌子之间的连接表。

比萨饼

编号 名字
1 玛格丽塔
2 香肠
3 素食主義者

成分

编号 名字
1 番茄
2 香肠
3 生菜

披萨配料

披萨 Id 成分 Id
1 1
2 1
2 2
3 1
3 3

我有一份配料清单,我想列出我可以用我拥有的配料制作的所有比萨饼。为了能够制作披萨,我需要拥有它的所有成分

如果在我的配料清单中,我有:,我想退回id 1的披萨,因为我只能制作玛格丽塔披萨。
如果在我的配料清单中,我有:,我想退回id 1和3的比萨饼,因为我有可能制作玛格丽塔或素食。
[1][1, 3]

我试过的:

SELECT
  pi.pizzaId
FROM
  pizzaIngredients pi
WHERE
  pi.ingredientsId NOT IN (
    SELECT
      DISTINCT pi2.ingredientsId
    FROM
      pizzaIngredients pi2
    WHERE
      pi2.ingredientsId NOT IN ('1')
  )

但它也还给了我不想要的披萨 2 和 3,因为我没有所有的成分。我使用postgresql数据库

SQL PostgreSQL 联接 匹配

评论


答:

1赞 Edouard 10/27/2022 #1

试试这个:

SELECT pi.pizzaId
  FROM pizzaIngredients pi
 GROUP BY pi.pizzaId
HAVING array_agg(ingredientId) <@ array [1,3]

dbfiddle

评论

0赞 loic.k 10/27/2022
谢谢爱德华,这就是我想要的结果。我计划使用 TypeORM 将其转换为我的代码,这在处理 postgresql 函数时非常糟糕,而且我不想使用原始查询。您是否知道如何,或者如果有可能,我可以获得与您的查询相同的结果,但不使用 postgresql 函数?如果没有,我会批准你的回答
0赞 Edouard 10/27/2022
嗨,Loic,对TypeORM一无所知,对不起
0赞 loic.k 10/27/2022
哦,不用担心,我会处理 TypeORM 部分!只是想知道您是否有没有 postgres 函数的 sql 查询的想法来获得相同的结果