在我的脑海中,我可以看到通过字符串匹配会出现的一些问题:
3 Avocados
and 2 Avocados
both use avocado, but the strings are not a match.
1 tbsp salt
and 15ml salt
refer to the same quantity of salt but the strings are not a match.
您可能需要保存一个配方成分表,其中还存储标准化的数量(即,在放入数据库之前,所有内容都将转换为特定的单位)。我在这里假设您已经有了一个食谱
的表和一个配料
表,这两个表在这里都用作外键(使其成为联接表)
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
中指定的数量进行比较。