2010-10-26 106 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; 

这样做的正确方法是什么?