2010-10-26 151 views
0

我當前的代碼是這樣的:MySQL的許多一對多的關係:幫助與查詢

$select = $this->select() 
       ->from(array('r' => 'recipes'), $this->getAdapter() 
                ->quoteInto("r.*, MATCH(title, directions) AGAINST(?) AS score", $searchText)) 
       ->where('MATCH(title, directions) AGAINST(?)', $searchText); 

//SQL: SELECT r.*, MATCH(title, directions) AGAINST('chicken soup') AS `score` FROM `recipes` AS `r` WHERE (MATCH(title, directions) AGAINST('chicken soup')) 

我想添加一個額外的WHERE子句僅發現含有一定成分的配方。我遇到的問題來自成分表和我的食譜表具有多對多關係的事實,具有包含'id','recipe_id'和'ingredient_id'列的連接表ingredient_recipes。

我該怎麼做?

+0

您可以提供更多關於您正在使用的設置的信息,例如:框架或數據庫抽象類? – 2010-10-26 10:33:44

+0

我正在使用Zend框架,但是我放了SQL,只是在純SQL中的答案會很好。 – moteutsch 2010-10-26 10:55:23

回答

0

這裏是簡單的SQL來按成分搜索食譜。你可以從那裏推斷具體細節。

SELECT r.* 
FROM recipes r 
LEFT OUTER JOIN recipe_ingredients ri ON r.recipe_id = re.recipe_id 
LEFT OUTER JOIN ingredients i on ri.ingredient_id = i.ingredient_id 
WHERE i.ingredient_title = "[Your Ingredient Variable]" 
GROUP BY r.recipe_id; 

對於多成分:

SELECT r.* 
FROM recipes r 
LEFT OUTER JOIN recipe_ingredients ri ON r.recipe_id = re.recipe_id 
LEFT OUTER JOIN ingredients i on ri.ingredient_id = i.ingredient_id 
WHERE i.ingredient_title = "[First Ingredient Var]" 
OR i.ingredient_title = "[Second Ingredient Var]" 
GROUP BY r.recipe_id; 

雖然如果你想找到的東西,既具有(不只是一個或其他),你可能需要做兩個查詢(或者至少一個子選擇),這對於大型數據庫來說可能是一個非常緩慢的查詢。

我能想到的一個單一的查詢會是這樣的最好的:

SELECT r.* 
FROM recipes r 
LEFT OUTER JOIN recipe_ingredients ri ON r.recipe_id = re.recipe_id 
LEFT OUTER JOIN ingredients i1 on ri.ingredient_id = i1.ingredient_id 
LEFT OUTER JOIN ingredients i2 on ri.ingredient_id = i2.ingredient_id 
WHERE i1.ingredient_title = "[First Ingredient Var]" 
AND i2.ingredient_title = "[Second Ingredient Var]" 
GROUP BY r.recipe_id; 

如果你創建另一個連接,每增加成分。這個查詢不會返回有一些(但不是全部)成分的食譜,只有那些有你想要的所有成分的食譜。

+0

非常感謝。但是,我怎樣才能找到有兩種成分的配方,例如既含有鹽又含有黃油的配方? – moteutsch 2010-10-26 15:44:33

+0

@moteutsch更新了我對多種成分的迴應 – enobrev 2010-10-26 16:57:27

0

我對MySQL不是很熟悉,但可以做類似的事情嗎?

SELECT r.* 
FROM recipes AS r 
LEFT JOIN recipe_sites AS s ON r.site_id = s.id 
WHERE '%salt%' IN (SELECT i.name 
        FROM ingredients AS i 
        LEFT JOIN recipe_ingredients AS ri ON i.id = ri.ingredient_id 
        LEFT JOIN recipes AS r ON ri.recipe_id = r.id) 
GROUP BY r.id; 

這樣做的正確方法是什麼?