4

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

应该有3个表:

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

接下来,假设我有一个“吐司”的食谱和一个“面包和黄油布丁”的食谱——吐司有两种成分(面包和黄油)——布丁可能有面包和黄油,加上面粉、鸡蛋和水——就这样一共5个。

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

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

4

4 回答 4

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”;“水”

于 2011-09-01T21:43:19.127 回答
0

假设iids给定的列表 (1,2,3),您可以尝试从(1,2,3) 和 中的所有relationship位置中选择所有(选择列表中的计数 <= 数量)iidridridsrelationshipiids

于 2011-09-01T21:34:42.593 回答
0

假设“ids”包含搜索成分 ID。

SELECT *
FROM Recipes
WHREE rid NOT IN (SELECT DISTINCT rid FROM Relationship WHERE iid NOT IN (ids))
于 2011-09-01T21:35:45.843 回答
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' 和 '%' 符号并放置 '= ?'。

于 2011-09-01T21:43:27.010 回答