Вне моей головы, вот некоторые проблемы, которые я вижу, которые возникнут при сопоставлении строк:
3 Avocados
и 2 Avocados
оба используют авокадо, но строки не совпадают.
1 tbsp salt
и 15ml salt
относятся к одинаковому количеству соли, но строки не совпадают.
Возможно, вы захотите сохранить таблицу рецептурных ингредиентов, в которой также хранятся нормализованные количества (т. Е. Все будет преобразовано в определенную единицу перед помещением в БД). Здесь я предполагаю, что у вас уже есть таблица для recipes
и таблица для 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
.