Php MySQL多对多关系:查询帮助

Php MySQL多对多关系:查询帮助,php,zend-framework,mysql,many-to-many,Php,Zend Framework,Mysql,Many To Many,我目前的代码是: $select = $this->select() ->from(array('r' => 'recipes'), $this->getAdapter() ->quoteInto("r.*, MATCH(title, directions) AGAINST(?) AS score", $searchText))

我目前的代码是:

$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\u id”列,和“成分id”


如何做到这一点?

以下是按配料搜索食谱的简单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;

您正在为每个附加成分创建另一个连接。此查询不会返回包含部分(但不是全部)成分的配方,只返回包含您正在查找的所有成分的配方。

我对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;

正确的方法是什么?

您能提供更多关于您正在使用的设置的信息吗,例如框架或数据库抽象类?我使用的是Zend框架,但我提供了SQL,仅使用普通SQL就可以了。谢谢,这很好。然而,我如何才能找到一个含有两种成分的食谱,例如一个同时含有“盐”和“黄油”的食谱?@moteutsch更新了我对多种成分的回答