2012-04-19 13 views
2

アイテムごとに名前、アイテム、タイプ、およびカウントを含むテーブルがあります。私は各タイプのMAXカウントを持つ名前を決定する方法を見つける必要があります。MySql:列でグループ化されたSUMのMAX値を見つける

例テーブル:

--------------------------------------- 
| name | item  | type  | count | 
| ------------------------------------| 
| Dave | carrot | vegetable | 2  | 
| Dave | broccoli | vegetable | 3  | 
| Tom | spinach | vegetable | 2  | 
| Jon | swiss | cheese | 3  | 
| Mark | cheddar | cheese | 5  | 
| Jon | cheddar | cheese | 6  | 
| Tony | onion | vegetable | 3  | 

私はそれぞれのタイプで最高SUM(カウント)と一人一人の名前を見つけたいです。私はすべての名前に対するクエリ以外、それは他のやって、その後、手動でMAXを計算するエレガントな方法があるかどうかを確認しようとしている

---------------------------- 
| name | type  | count | 
| -------------------------| 
| Dave | vegetable | 5  | 
| Jon | cheese | 9  | 

:これは私の予想結果です。私の前にデータベースを持たずに

+0

ネクタイの場合にはどうしたらよいでしょうか? –

+0

それは9でなければなりません、私はそれを急いでねじ込みました。 理想的には、結びつきのある結果がすべて表示されますが、1つだけ表示されても問題ありません。 – tastyfish

答えて

2

を第一には、それぞれの名前/カテゴリの組み合わせの合計を計算します。これをサブクエリまたはビューのいずれかで行います。私はコードの膨張を減らすためにビューを選ぶつもりです。なぜなら、それは複数回必要となるからです。

CREATE VIEW totals AS 
SELECT name, type, SUM(count) AS count 
FROM yourtable 
GROUP BY name, type 
 
---------------------------- 
| name | type  | count | 
| -------------------------| 
| Dave | vegetable | 5  | 
| Tony | vegetable | 3  | 
| Tom | vegetable | 2  | 
| Jon | cheese | 9  | 
| Mark | cheese | 5  | 
---------------------------- 

今、あなたは、各タイプの最大数を見つける必要があります。

SELECT type, MAX(count) AS max_count 
FROM totals 
GROUP BY type 
 
------------------------- 
| type  | max_count | 
| ----------------------- 
| vegetable | 5   | 
| cheese | 9   | 
------------------------- 

今、あなただけ(タイプ、カウント)は、第2の結果セットのペアのいずれかに等しいすべての行で表示totalsを照会する必要があります。私はすでにあなたのために仕事のほとんどをしてきました。私はそれを終わらせるためにあなたを残します。

+0

私はこれがトリックを行うべきだと思います。ありがとうございました! – tastyfish

+0

私は最大結果クエリを 'totals' VIEWでジョインし、一致した行を選んだ。それは私が探していた正確な結果を私に与えました。 @マーク – tastyfish

0

、これに打撃与える:

SELECT * FROM Table T 
    LEFT JOIN (SELECT type, MAX(count) AS max FROM Table GROUP BY type) AS maxType 
    ON T.type = maxType.type 
    AND t.count = max.count 
3

これが最適ではないかもしれないが、それは非常に簡単です:外側その後

NAME TYPE COUNT 
Jon  cheese  9 
Dave vegetable 5 
Mark cheese  5 
Tony vegetable 3 
Tom  vegetable 2 

SELECT name, type, MAX(count) as count FROM (
    SELECT name, type, SUM(count) as count 
    FROM mytable 
    GROUP BY type, name 
) as rank 
GROUP BY type; 

内側のクエリは次のように、その名前のためにそれぞれの名前とタイプの合計を返します。タイプごとに1つの名前を返すだけであり、max()がそのタイプのトップネームを返します。

これは結び付けられた名前を返しませんが、異なるタイプの同じ名前を返します。したがって、スイスで突然Dave 10を与えた場合、野菜とチーズのトップとして表示されます。

+0

私はこれがトリックを行うべきだと思います。ありがとうございました! – tastyfish

+0

喜んで助けてください!答えを受け入れることは、それを与えたユーザーの評判を助けることを忘れないでください。 – Anthony

関連する問題