说我有一个食谱数据库,我想根据我的成分搜索它们。
应该有3个表:
食谱(rid,rname),
成分(iid,iname),
关系(摆脱,iid)
接下来,让我们想象一下我有'吐司'的食谱和'面包和黄油布丁'的配方 - 吐司有2种成分(面包和黄油) - 布丁可能有面包和黄油,加上面粉,鸡蛋和水 - 总共5个。
我的问题是,根据搜索中提供的成分构建SQL查询。如果我在我的搜索中提交3种成分 - 面包,黄油和鸡蛋 - 那么(从讨论的2个食谱中)只应生成一个结果 - 吐司! - 因为没有足够的成分来制作布丁!
那么这样的SQL查询实际上是什么样的?我已经尝试了一切,谷歌搜索了一切,现在我的大脑再也无法处理它了。
答案 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
位于(rids
中relationship
的选择,其中包含< = 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'和'%'符号并放置'=?'。