在 MySql/Jpa 上的多对多关系中查找包含 other table 的全部或部分 ID 列表的记录?

Find a record containing all or a part of a list of id of other table in a many-to-many relation on MySql/Jpa?

在我的网络应用程序中,我有 3 个 tables:

我需要找到包含提供的配料列表 (TAB C) 的所有食谱 (TAB A)。

Es:

我提供了一个成分列表,如 111(意大利面)、222(胡椒)、333(油),我需要找到包含这些成分的所有食谱。查询应该 return 我所有那些最多包含这些成分的食谱。

所以如果我 运行 这样的搜索:

...
WHERE TAB_B.fk_ingredients IN (111,222,333)  // IT DOESN'T WORKS AS I WISH
...

它必须 return 一个食谱列表,其中包含最大成分 (111,222,333) 和我传递的最小成分之一。

结果示例:

id name list_fk_ingredients (es.)
1 Spaghetti with pepper 111,222
2 Spaghetti with oil 111,333
3 Pepper with nothing 222
4 Spaghetti with everything 111,222,333

我还需要一种方法将查询报告回 JPA。

提前致谢!

此致

首先,您需要一个子查询,您可以在其中加入 table,然后按食谱对它们进行分组

SELECT R.name, count(R.id) AS sum
FROM Recipes as R
join Recipes_Ingredients as RI on R.id=RI.fk_recipe
group by R.id

它将为您输出所有食谱的列表,并计算每个食谱的成分数量。我在这里将成分计数命名为总和。

您不需要加入成分table。

接下来,您只需使用 WHERE 语句从该查询中 select 包含 3 条或更少以及 1 条或更多的记录。

SELECT R.name, sum
FROM (SELECT R.name, count(R.id) AS sum
FROM Recipes as R
join Recipes_Ingredients as RI on R.id=RI.fk_recipe
group by R.id) as T
WHERE sum <= 3
AND sum >=1

试试这个查询:

SELECT ri.recipes_id
FROM recipes_ingredients ri
GROUP BY ri.recipes_id
HAVING COUNT(CASE WHEN ri.ingredients_id NOT IN (111,222,333) THEN 1 ELSE NULL END) =0;