PHP MySQL配方搜索基于提供的成分

时间:2011-09-01 21:18:16

标签: php mysql database search recipe

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

应该有3个表:

食谱(rid,rname),
成分(iid,iname),
关系(摆脱,iid)

接下来,让我们想象一下我有'吐司'的食谱和'面包和黄油布丁'的配方 - 吐司有2种成分(面包和黄油) - 布丁可能有面包和黄油,加上面粉,鸡蛋和水 - 总共5个。

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

那么这样的SQL查询实际上是什么样的?我已经尝试了一切,谷歌搜索了一切,现在我的大脑再也无法处理它了。

4 个答案:

答案 0 :(得分: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”; “水”

答案 1 :(得分:0)

假定iids列表已被给定(1,2,3),您可以尝试从relationship所在的iid中选择全部(1,2,3)并且rid位于(ridsrelationship的选择,其中包含< = iids列表中的{{1}}

答案 2 :(得分:0)

假设'ids'持有搜索成分ID。

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

答案 3 :(得分:0)

我的回答是假设您正在使用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'和'%'符号并放置'=?'。