【问题标题】:MySQL many-to-many relationship: Help With QueryMySQL 多对多关系:查询帮助
【发布时间】:2010-10-26 10:29:46
【问题描述】:

我当前的代码是这样的:

$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 子句,以便仅查找包含某种成分的食谱。 我遇到的问题来自于成分表和我的食谱表有一个多对-many 关系,连接表成分_recipes 具有列“id”、“recipe_id”和“ingredient_id”。

我该怎么做?

【问题讨论】:

  • 您能否提供有关您正在使用的设置的更多信息,例如框架或数据库抽象类?
  • 我正在使用 Zend 框架,但我提出了 SQL,并且只用简单的 SQL 来回答会很棒。

标签: php zend-framework mysql many-to-many


【解决方案1】:

这是按成分搜索食谱的简单 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;

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

【讨论】:

  • 谢谢,太好了。但是,我怎样才能找到包含两种成分的食谱,例如同时包含“盐”和“黄油”的食谱?
  • @moteutsch 更新了我对多种成分的回复
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2016-03-08
    • 2019-12-09
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多