分组数据,稍后获取额外的字段

时间:2013-04-17 15:29:12

标签: mysql sql greatest-n-per-group

我有以下数据结构:

Pizza
------------------
id| name
--+---------------
1 | The Best Pizza
2 | Other Pizza

Toppings
-----------------------------------------
id| pizza | order | type | requests| name        
--+-------+------------------------------
1 | 1     | 0     | A    | 10      | something
1 | 1     | 0     | A    | 14      | some
2 | 1     | 0     | B    | 12      | other
3 | 2     | 1     | A    | 40      | another
4 | 2     | 0     | A    | 20      | nononnon

所以,我的目标是获得类似

的东西
Pizza          | Important Topping | Type    
---------------+--------------------------------------------------------     
The Best Pizza |  some             | A
The Best Pizza |  other            | B
Other Pizza    |  nononnon         | A

这意味着:

对于每组Pizza和Topping.Type给出最重要的顶部 其中最重要的导入顶点是:Topping.order ASC,请求DESC 例如,在上面的结果中,类型A的“最佳比萨”最重要的顶部是一些,因为一些和一些浇头具有相同的顺序,但是一些具有更多的请求。 对于“其他比萨饼”,我们只有一种类型,“nononnon”是最重要的,因为它的顺序低于“另一种”,甚至另一种有更多的请求

我面临的问题是如何在一个查询中或至少以有效的方式实现这一目标。

现在我必须预先选择和oder浇头,创建临时表和丑陋的连接来实现这一点。

关于如何做到这一点的任何启示?

注意:这是我面临的问题的一个例子,我知道对于披萨/顶级模型的真正实现将不会更接近这个

1 个答案:

答案 0 :(得分:0)

这是一种方法:

select pizzaName, type,
       (select name from toppings t2 where t2.type = t.type and t2.pizza = t.pizza
        order by order, requests desc
        limit 1
       ) as importantTopping
from (select distinct p.name as pizzaName, type
      from toppings t join
           pizza p
           on t.pizza = p.id
     ) pt

它使用相关子查询来获取您正在寻找的顶部。