0

这是我当前的设置:
我有 2 个表,RECIPEINGREDIENTS
RECIPE在其他数据中保存ID 。每个配方需要 X 行成分。
一个如何匹配至少 2 种匹配成分的 2 种食谱?
我可以指定必须匹配的成分,但我的问题是当食谱有超过 10 种成分并且我需要两个使用相同 2 成分的食谱时,不知道哪些成分。
对不起,我的英语不是我的自然语言。如果需要,或者如果我不够清楚,我会发布更多详细信息。

实际示例:
食谱 1 有:鱼、土豆和盐。
食谱 2 有:火鸡和米饭。
食谱 3 有:鱼、米饭和盐。
食谱 4 有:火鸡、土豆和盐。

基于配方 1 的结果应为:4
基于配方 2 的结果应为:无
基于配方 3 的结果应为:1
基于配方 4 的结果应为:1
(是的,我需要根据过滤器运行每个配方,而不是这里解释)

4

2 回答 2

2

尝试这样的事情:

WITH REC_ING AS (
SELECT *
FROM RECIPE AS T1
INNER JOIN
INGREDIENTS AS T2
ON T1.ID = T2.ID)

SELECT *
FROM (
SELECT T1.ID AS ID1, T2.ID AS ID2
FROM REC_ING AS T1
INNER JOIN
REC_ING AS T2
ON T1.INGREDIENT_ID = T2.INGREDIENT_ID 
AND T1.ID != T2.ID) AS JOINED_TAB
GROUP BY ID1, ID2
HAVING COUNT(*) >= 2

这是一个粗略的副本。如果这听起来像您正在寻找的东西,我可以制作一个更详细的示例(包括 SQL Fiddle)。

于 2012-10-13T22:19:39.083 回答
1

如果您需要将其扩展到 2 个以上的成分,或者要更详细地解释问题空间以及存在哪些替代查询,请查看有关RELATIONAL DIVISION的扩展文章。


select DISTINCT A.recipe_id, C.recipe_id other_recipe_id
from INGREDIENTS A
join INGREDIENTS B on A.recipe_id = B.recipe_id and A.ingredient < B.ingredient
join INGREDIENTS C on A.recipe_id < C.recipe_id and C.ingredient = A.ingredient
join INGREDIENTS D on C.recipe_id = D.recipe_id and D.ingredient < B.ingredient

A 和 B 是属于同一配方的两种不同成分。使用这些,我们连接到 C 和 D,它们是相同的两种成分 (A=C,B=D),但其中 C 和 D 属于相同的其他配方。

这将返回共享 2 种成分的每对食谱的不同 ID。您可以通过将名称加入两次配方表来获取实际的配方名称。

于 2012-10-13T22:19:53.007 回答