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.order ASC, request DESC 例: 上記の結果では、「The Best Pizza」の最も重要なトッピングwith type A is some. some と something のトッピングの順序は同じですが、より多くのリクエストがあるものもあります。「その他のピザ」は1種類しかありませんでしたが、「ののんのん」は「別の」よりも注文が少ないため、最も重要なトッピングです。

私が直面している問題は、これを 1 つのクエリで、または少なくとも効率的な方法で達成する方法です。

ここで、トッピングを事前に選択して注文し、これを実現するために一時テーブルと醜い結合を作成する必要がありました。

これを行う方法についての啓発はありますか?

注: これは私が直面している問題の例です。ピザ/トッピング モデルの実際の実装では、これに近づくことはありません。

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 に答える