0

好的,对于这个问题,我需要知道如何制作排序结果的算法。

让我解释一个问题:

我有不同的菜谱(超过 2000 种)由不同的成分组成。

有3张桌子:

dish
id | name

ingredient
id | name

dish_ingredient
id | id_dish | id_ingredient

我制作的应用程序让用户选择他们拥有的不同食材,应用程序会根据他们拥有的食材数量向他们显示正确的菜谱。现在我想要一个算法,用户可以选择成分并添加某种“重量”。

目前适用的示例:如果用户选择配料牛肉、胡萝卜、洋葱、盐、胡椒,算法会查看哪些食谱有这些配料(不一定全部),并按用户拥有的配料对它们进行排序。所以这个排序的第一个食谱可能只有盐,然后可能是面粉和鸡蛋(煎饼的食谱),在列表的末尾可能有牛肉的食谱,这对用户来说更方便。

所以我的想法是用户可以在他的成分上添加一些权重,这样搜索算法就会给他更合适的食谱。如果您不明白我想要什么,您可以在www.mizicapogrnise.si上查看应用程序(将其从斯洛文尼亚语翻译成您的语言),了解应用程序现在是如何工作的。

感谢你的帮助。

4

1 回答 1

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表格以获得每道菜中每种成分的重量。外部查询按菜聚合结果:

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;

这两种方法都需要修改查询以将必要的重量信息输入数据库。

于 2013-06-08T14:33:51.930 回答