我可能试图在单个查询中完成太多,但我有一个sqlite数据库,格式错误的食谱。这将返回已添加相关性的配方的已排序列表:
SELECT *, sum(relevance) FROM (
SELECT *,1 AS relevance FROM recipes WHERE ingredients LIKE '%milk%' UNION ALL
SELECT *,1 AS relevance FROM recipes WHERE ingredients LIKE '%flour%' UNION ALL
SELECT *,1 AS relevance FROM recipes WHERE ingredients LIKE '%sugar%'
) results GROUP BY recipeID ORDER BY sum(relevance) DESC;
但我现在遇到一个特殊情况,我需要将相关值写入与食谱相同的行中的字段。我在这些方面找到了一些东西:
UPDATE recipes SET relevance=(SELECT sum(relevance) ...)
但是我还没有能够使用它。我会继续努力,但同时请告诉我你将如何处理这个问题?
编辑:评估Peter的解决方案,由于必须执行操作的数据量,我遇到了一些严重的性能问题。我写了一个小的Rebol脚本,它执行循环和查找,并以1000行批量提交。它在几分钟内完成。
答案 0 :(得分:2)
你真的应该修复你的模型(见下文)。
如果你不能,下面的查询应该可以工作(我试过它,它按照我的预期工作)。
Update recipes
Set relevance =
(
Select Case When ingredients Like '%milk%' Then 1 Else 0 End
+ Case When ingredients Like '%flour%' Then 1 Else 0 End
+ ...
From recipes r2
Where r2.recipe_id = recipes.recipe_id
)
它使用Case
来总结所有匹配的成分。
推荐型号:
表recipes
表ingredients
表recipe_ingredients
recipe_id
ingredient_id