【问题标题】:PHP & MySQL & forms -- flexible search? (ex: X ingredients can make Y recipes)PHP & MySQL & forms -- 灵活的搜索? (例如:X 种成分可以制作 Y 种食谱)
【发布时间】:2010-12-06 05:32:44
【问题描述】:

我刚刚开始使用 PHP/MySQL,所以请原谅这个相当简单的问题:

作为一个实践示例,我想创建一个小的食谱数据库。每个食谱都有 X 种不同的成分。我认为该表很简单 - 每行代表一个食谱,第一个(主键)之后的每一列都是具有 TRUE/FALSE 值的成分(需要/不需要)。

但是我如何制作一个可以搜索该表的基于复选框的表单,这样如果我检查 5 种不同的成分(胡萝卜、猪肉、大米、黄油、土豆),查询将返回我只能用这些成分制作的每个食谱5 种成分?

因此,不会退回使用这 5 个和其他东西的食谱。 但是只使用这 5 个中的 4 个的配方将被退回。

以我有限的知识,我设想的查询字符串似乎塞满了 IF,而且非常笨拙……而且这只是一些成分,如果我有超过一百个怎么办?哎呀。

【问题讨论】:

    标签: php mysql search dynamic


    【解决方案1】:

    你应该以不同的方式设计你的桌子:

    • 食谱 - ID、姓名
    • 成分 - ID、名称
    • RecipesIngredients - recipeID、componentID、数量

      Recipes
      ID name
      1 scalloped potato
      2 cheesy carrots
      3 saucy potato
      
      Ingredients
      ID name
      1 potato
      2 sauce
      3 cheese
      4 carrots
      
      RecipesIngredients
      recipesID ingredientID    amount
      1          1               5 lbs
      1          2               2 cups
      1          3               1 cup
      2          3               1/2 cup
      2          4               2 whole
      3          2               a smidge
      3          1               1 whole red
      

    要获取所有包含奶酪和土豆的食谱:

    SELECT * from recipes r 
    INNER JOIN RecipesIngredients ri on r.id=ri.recipeID
    INNER JOIN Ingredients i on i.id = ri.ingredientID
    WHERE i.name in ('cheese','potato')
    

    【讨论】:

    • 只是为了记录,如果你很好奇,这被称为 EAV 数据库模型。它代表实体-属性-值。本例中的实体是配方,属性是成分,值是数量。更难的部分在于设计查询以按照您想要的方式从表中获取数据......我相信 Byron 的示例将返回一些您不想要的食谱。
    猜你喜欢
    • 2011-11-08
    • 2021-02-07
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多