2012-10-13 32 views
0

這是我的當前設置之間搜索至少2個類似的行:
我有2個表,食譜成分
菜譜保持ID其他數據。 INGREDIENTS具有所需的每個配方X的行。
怎麼能匹配2個食譜有至少2層相匹配的成分?
我能做到這一點指定哪些成分必須匹配,但我的問題是,當配方有超過10種成分,我需要使用相同的2種成份兩個配方,不知道哪些。
對不起我的英文,不是我的自然語言。如果需要,我會發布更多細節,或者我不夠清楚。

實踐例子:
食譜1有:魚,土豆和鹽。
食譜2有:火雞和大米。
食譜3有:魚,米飯和鹽。
配方4具有:火雞,土豆和鹽。基於配方1

結果應該是:根據配方2應爲4
結果:無
基於配方3 結果應該是:1個
結果基於配方4應該是:1
(是的,我需要根據未在此處說明的過濾器)運行的每一節
SQL:不同的表

回答

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小提琴)。

+0

我要試試這個,謝謝。 –

+1

嗯......不工作,仍然試圖找出。食譜和配料只是一個例子。真正的桌子與食物無關:D:D:D –

+0

好吧。我會堅持這一個。它更靈活。 –

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。您可以通過兩次返回配方表獲取名稱的實際配方名稱。

+0

這很好,但如果我需要3個匹配成分,我必須更改代碼。但我會對它進行一些測試。謝謝 –

+0

幾乎沒有修改這個作品很好(請記住,原來的表與食物無關) –

+0

理查德,我遇到了一個問題,獲得RECIPE上的一個值,你能幫忙嗎? –