2013-11-15 49 views
0

我有3个表如何使查询显示?

recipe 
+----------+---------+ 
| recipe_id|  name| 
+----------+---------+ 
|   1| name_1| 
+----------+---------+ 
|   2| name_2| 
+----------+---------+ 
|   3| name_3| 
+----------+---------+ 

ingredient 
+--------------+---------+ 
| ingredient_id|  name| 
+--------------+---------+ 
|    7| cheese| 
+--------------+---------+ 
|    9| pepper| 
+--------------+---------+ 
|   16| tomato| 
+--------------+---------+ 

recipe_ingredient 
+----------+---------------+ 
| recipe_id| ingredient_id| 
+----------+---------------+ 
|   1|    7| 
+----------+---------------+ 
|   1|    16| 
+----------+---------------+ 
|   2|    7| 
+----------+---------------+ 
|   3|    7| 
+----------+---------------+ 
|   3|    9| 
+----------+---------------+ 
|   3|    16| 
+----------+---------------+ 

如何来仅显示那些在其中的成分是严格相同的食谱? 我用它

SELECT r.name, r.recipe_id 
    FROM recipe AS r 
    LEFT JOIN recipe_ingredient AS r_i ON r_i.ingredient_id = '7' 
       OR r_i.ingredient_id = '16' 
WHERE r.recipe_id=r_i.recipe_id 

但它并不因为我需要to.In工作进行到底,我要得到这样的结果。

+----------+---------------+ 
|  name|  recipe_id| 
+----------+---------------+ 
| name_1|    1| 
+----------+---------------+ 
| name_3|    3| 
+----------+---------------+ 

帮助,请

P.S:对不起我的英文不好

+0

配方号1不具有相同的成分。 – Sebas

+0

他的意思与他检查的成分列表相同,在本例中为7和16。 – Barmar

+0

请添加您用当前代码获得的输出。 – sushain97

回答

0
SELECT `r`.`recipe_id`, `r`.`name` 
    FROM `recipe` `r` 
    JOIN (SELECT `r_i`.`recipe_id` 
      FROM `recipe_ingredient` `r_i` 
      WHERE `r_i`.`ingredient_id` IN (7,16) 
      GROUP BY `r_i`.`recipe_id` 
      HAVING COUNT(`recipe_id`) >= 2 
    ) `result` ON `r`.`recipe_id` = `result`.`recipe_id` 

例如:

$ingred_arr = array(7,16); 
$count_ingred = count($ingred_arr); 

$query = " 
    SELECT `r`.`recipe_id`, `r`.`name` 
    FROM `recipe` `r` 
    JOIN (SELECT `r_i`.`recipe_id` 
      FROM `recipe_ingredient` `r_i` 
      WHERE `r_i`.`ingredient_id` IN (".implode(',',$ingred_arr).") 
      GROUP BY `r_i`.`recipe_id` 
      HAVING COUNT(`recipe_id`) >= ".$count_ingred." 
    ) `result` ON `r`.`recipe_id` = `result`.`recipe_id` " 

结果:

+----------+---------------+ 
|  name|  recipe_id| 
+----------+---------------+ 
| name_1|    1| 
+----------+---------------+ 
| name_3|    3| 
+----------+---------------+ 
0
SELECT r.name, r.recipe_id 
FROM recipe AS r 
JOIN (SELECT recipe_id, 
      COUNT(*) c AS total_ingredients, 
      SUM(ingredient_id IN (7, 16)) AS matching_ingredients 
     FROM recipe_ingredient 
     GROUP BY recipe_id 
     HAVING total_ingredients = 2 AND matching_ingredients = 2) AS r_i 
ON r.recipe_id = r_i.recipe_id 

一般来说,HAVING子句中的值应该是IN子句中成分的数量。

+0

这并不是我所需要的,因为我不知道配方中每种成分的含量。 我可以在表中添加另一列吗? 'HAVING total_ingredients = r.count_ingredients AND matching_ingredients = 2' 如果我有25,000个食谱,它是否会工作得很快? –

+0

您可以将'quantity'列添加到'recipe_ingredient'表中。我的查询不关心。 – Barmar

+0

但是,如果你只想找到需要4个西红柿和3片奶酪的食谱,它会变得更加复杂。 – Barmar