好的,对于这个问题,我需要了解如何制作排序结果的算法。
让我解释一个问题:
我有不同的菜肴配方(超过2000种)由不同的成分组成。
有3个表:
dish
id | name
ingredient
id | name
dish_ingredient
id | id_dish | id_ingredient
我做的应用程序让用户选择他们拥有的不同成分,应用程序根据他们的成分计数显示他们正确的菜肴配方。现在我想要算法,用户可以选择成分并添加某种“重量”。
现在适用的例子:如果用户选择配料牛肉,胡萝卜,洋葱,盐,胡椒算法,看看哪些配方有这些成分(不一定都是必需的),并按照用户的成分对它们进行分类。因此,从这种分类的第一个配方可能只有盐,然后可能是面粉和鸡蛋(煎饼配方)在列表的末尾可能有牛肉配方,更方便用户。
所以我的想法是用户可以在他的成分上添加一些权重,因此搜索算法会给他更合适的食谱。如果您不理解我想要的内容,您可以在www.mizicapogrnise.si上看到应用程序(将其从斯洛文尼亚语翻译成您的语言)以查看应用程序现在的工作方式。
感谢您的帮助。
答案 0 :(得分:3)
计算成分的基本查询是:
select di.id_dish, count(*) as NumIngredients
from dish_ingredient di join
ingredient i
on i.id = di.id_ingredient
group by di.id_dish;
您可以通过在查询中引入case
子句来修改此成分:
select di.id_dish, count(*) as NumIngredients,
sum(case when i.name = 'beef' then 2.0
when i.name = 'salt' then 0.5
. . .
end) as SumWeights
from dish_ingredient di join
ingredient i
on i.id = di.id_ingredient
group by di.id_dish
order by SumWeights desc;
. . .
不是SQL语法的一部分。你必须填写相似的行。
另一种方法是将信息放在子查询中。子查询包含每种成分的重量。然后将其连接到dish_ingredient
表以获得每个菜肴中每种成分的重量。外部查询通过dish聚合结果:
select di.id_dish, count(*) as NumIngredients,
sum(w.weight) as SumWeights
from dish_ingredient di join
ingredient i
on i.id = di.id_ingredient left outer join
(select 'beef' as name, 2.0 as weight union all
select 'salt', 0.5 union all
. . .
) w
on i.name = w.name
group by di.id_dish
order by SumWeights desc;
这两种方法都需要修改查询以将必要的权重信息输入数据库。