【问题标题】:PHP MySQL recipe search based on what ingredients are provided基于提供的成分的 PHP MySQL 食谱搜索
【发布时间】:2011-11-08 18:03:09
【问题描述】:

假设我有一个食谱数据库,我想根据我拥有的成分搜索它们。

应该有3个表:

食谱(消除,rname),
成分(iid,iname),
关系(rid,iid)

接下来,假设我有一个“吐司”的食谱和一个“面包和黄油布丁”的食谱 - 吐司有 2 种成分(面包和黄油) - 布丁可能有面包和黄油,以及面粉、鸡蛋和水- 总共有 5 个。

我的问题是,根据搜索中提供的成分构建 SQL 查询。如果我在搜索中提交 3 种成分——面包、黄油和鸡蛋——那么(从讨论的 2 种食谱中)应该只产生一个结果——吐司! - 因为没有足够的原料来做布丁!

那么这样的 sql 查询实际上是什么样子的呢?我已经尝试了所有方法,用 Google 搜索了所有内容,现在我的大脑无法再处理它了。

【问题讨论】:

    标签: php mysql database search recipe


    【解决方案1】:

    不知道这是否是最好的方法,但是对于您提供的示例,它会起作用:

    SELECT
        *
    FROM
        recipes
    WHERE
        rid NOT IN (
            /* exclude all recipes with other ingredients */
            SELECT rid FROM relationship WHERE iid NOT IN (1, 2, 4)
        )
    

    对不起我的英语 =)

    编辑:成分的 ID 与它们在您的问题中的顺序相同,因此 1 是面包,2 是黄油,4 是鸡蛋:

    "iid";"iname" “1”;“面包” “2”;“黄油” “3”;“面粉” “4”;“鸡蛋” "5";"水"

    【讨论】:

      【解决方案2】:

      假设iids 的列表是(1,2,3),您可以尝试从relationship 中选择所有iid 在(1,2,3) 和rid 在(relationshiprids 的选择具有计数iids 的数量)

      【讨论】:

        【解决方案3】:

        假设 'ids' 包含搜索成分 ID。

        SELECT *
        FROM Recipes
        WHREE rid NOT IN (SELECT DISTINCT rid FROM Relationship WHERE iid NOT IN (ids))
        

        【讨论】:

          【解决方案4】:

          我的回答假设您正在使用 PDO,但如果使用基本的 mysql 或 mysqli 调用,您可以根据需要进行修改:

          $ingredient1 = $_POST['ingredient1'];
          $ingredient2 = $_POST['ingredient2'];
          $ingredient3 = $_POST['ingredient3'];
          
          $sql = '
          SELECT
           c.rid,
           c.rname
          FROM ingredients a
          JOIN relationship b ON (a.iid = b.iid)
          JOIN recipes c ON (b.rid = c.rid)
          WHERE
               (a.iname LIKE ? AND a.iname LIKE ? AND a.iname LIKE ?)
          ';
          
          $stmt = $db->prepare($sql)
          $stmt->execute(array('%'.$ingredient1.'%', '%'.$ingredient2.'%', '%'.$ingredient3.'%'));
          

          我的回答当然假设您的陈述将始终包含三个食谱,并且您正在使用后变量,但也可以进行修改以适应可变性。与其他查询相比,这种查询的好处是您不必使用传统上效率较低的子查询。

          编辑

          忘记在数组值中添加“%”符号。这将匹配您在相应表中的任何成分名称。如果它必须匹配,只需删除“LIKE”和“%”符号并放置“= ?”。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-06
            • 1970-01-01
            • 1970-01-01
            • 2016-10-01
            • 1970-01-01
            • 2023-03-03
            • 1970-01-01
            相关资源
            最近更新 更多