【问题标题】:How to select a row which has one coloumn with two different attributes?如何选择一列具有两个不同属性的行?
【发布时间】:2012-03-03 01:10:20
【问题描述】:

我正在做一个关于使用 PHP(使用 Codeigniter)和 MYSQL 烹饪食谱的项目。

我有三张桌子:

  • Ingredients - id, name.
  • Recipe - id, name
  • ing_to_rep - recipe_id, ingredient_id(我用这张表来记录哪个食谱​​有哪些成分。)

“获取所有包含鸡蛋 (id = 64) 和盐 (id = 65) 的食谱”的查询是什么

我试过了:

SELECT * FROM recipe JOIN ing_to_rep ON recipe.id = ing_to_rep.rep_id 
WHERE ing_to_rep.ing_id = 64 AND ing_to_rep.ing_id = 65

当然,它什么也不返回,但它可以帮助你得到我想要做的事情。

【问题讨论】:

    标签: php mysql sql codeigniter


    【解决方案1】:

    可能有一种更高效、更灵活的方法,但是两个子查询连接就可以了:

    SELECT
      recipe.*
    FROM recipe
      JOIN (SELECT recipe_id FROM ing_to_rep WHERE ingredient_id = 64) AS ing1 ON recipe.id = ing1.recipe_id
      JOIN (SELECT recipe_id FROM ing_to_rep WHERE ingredient_id = 65) AS ing2 ON recipe.id = ing2.recipe_id
    

    也可以通过EXISTS完成

    SELECT 
      recipe.*
    FROM 
      recipe
    WHERE
      EXISTS (SELECT recipe_id FROM ing_to_rep ing1 WHERE ingredient_id = 64 AND recipe.id = ing1.recipe_id)
      AND  EXISTS (SELECT recipe_id FROM ing_to_rep ing2 WHERE ingredient_id = 65 AND recipe.id = ing2.recipe_id)
    

    【讨论】:

    • 这个方案有个缺点:CI(ActiveRecord)不支持子查询!请参阅我的无子查询解决方案 :)
    【解决方案2】:

    另一种解决方案是

    SELECT * FROM recipe r JOIN 
    (SELECT recipe_id FROM ing_to_rep 
     GROUP BY recipe_id
     HAVING SUM(IF(ingredient_id IN (64, 65), 1, 0)) = 2) gr ON r.id = gr.recipe_id
    

    我不确定性能,你必须自己尝试。

    【讨论】:

      【解决方案3】:

      一种无子查询的方法(CI 的 AR 不支持子查询):

      SELECT *
      FROM recipe
      JOIN ing_to_rep ON (ing_to_rep.id_recipe=recipe.id AND (ing_to_rep.ing_id=64 OR ing_to_rep.ing_id=65))
      GROUP BY recipe.id
      HAVING COUNT(ing_to_rep.ing_id)=2
      

      您可以使用此解决方案 CI 的 ActiveRecord。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2022-11-29
        • 2016-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        相关资源
        最近更新 更多