在我的脑海中,我可以看到一些通过字符串匹配出现的问题:
3 Avocados
并且2 Avocados
都使用鳄梨,但字符串不匹配。
1 tbsp salt
并15ml salt
引用相同数量的盐,但字符串不匹配。
您可能希望保留一个配方成分表,该表还存储标准化数量(即,在放入数据库之前,所有内容都将转换为特定单位)。我在这里假设您已经有一个表 forrecipes
和一个表 for ingredients
,这两个表都在这里用作外键(使其成为连接表)
CREATE TABLE recipe_ingredients (
recipe_id INT NOT NULL,
ingredient_id INT NOT NULL,
quantity DECIMAL NOT NULL,
PRIMARY KEY (recipe_id, ingredient_id),
FOREIGN KEY recipe_id REFERENCES recipes (id),
FOREIGN KEY ingredient_id REFERENCES ingredient (id)
)
然后在确定匹配项时,您可以使用确定哪个配方包含您正在寻找的最多成分(这忽略了数量):
SELECT ri.recipe_id, COUNT(ri.ingredient_id) AS num_common_ingredients
FROM ingredients AS i
RIGHT JOIN recipe_ingredients AS ri
ON ri.ingredient_id = i.id
WHERE i.id IN (?) -- list of ingredient IDs being searched for
GROUP BY ri.recipe_id
ORDER BY COUNT(ri.ingredient_id) DESC
最高的行具有最大COUNT
的相似性(因为这意味着有最多的共同成分)。
要确定数量之间的相似性,一旦您的食谱与大多数成分数量相匹配,您可以将给出的数量与 中指定的数量进行比较recipe_ingredients
。