1

我有以下数据结构:

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,其中最重要的 topping 的顺序是:Topping.order ASC,例如请求 DESC,在上面的结果中,“The Best Pizza”最重要的 topping类型 A 是 some,因为 some 和 something 浇头具有相同的顺序,但 some 有更多请求。对于“Other Pizza”,我们只有一种类型,“nononnon”是最重要的配料,因为它的订单低于“another”,甚至另一个有更多要求

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

现在我必须预先选择和订购配料,创建临时表和丑陋的连接来实现这一点。

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

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

4

1 回答 1

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

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

于 2013-04-17T15:51:50.230 回答