mysql在查询参数上添加权重

时间:2013-06-08 14:28:56

标签: php mysql sql

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

让我解释一个问题:

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

有3个表:

dish
id | name

ingredient
id | name

dish_ingredient
id | id_dish | id_ingredient

我做的应用程序让用户选择他们拥有的不同成分,应用程序根据他们的成分计数显示他们正确的菜肴配方。现在我想要算法,用户可以选择成分并添加某种“重量”。

现在适用的例子:如果用户选择配料牛肉,胡萝卜,洋葱,盐,胡椒算法,看看哪些配方有这些成分(不一定都是必需的),并按照用户的成分对它们进行分类。因此,从这种分类的第一个配方可能只有盐,然后可能是面粉和鸡蛋(煎饼配方)在列表的末尾可能有牛肉配方,更方便用户。

所以我的想法是用户可以在他的成分上添加一些权重,因此搜索算法会给他更合适的食谱。如果您不理解我想要的内容,您可以在www.mizicapogrnise.si上看到应用程序(将其从斯洛文尼亚语翻译成您的语言)以查看应用程序现在的工作方式。

感谢您的帮助。

1 个答案:

答案 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;

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