2012-03-07 3 views
0

私はMySQLのテーブルを持っている:シンプルなテーブル。難しい要求

level  box 
1   1 
2   2 
3   2 
1   3 
2   1 
2   3 
2   3 
3   1 

どのように私は、MySQLのクエリでこのテーブルを得ることができますか?

  box1  box2   box3 
level1 1  0   1 
level2 1  1   2 
level3 1  1   0 

私は大きなテーブルを持っているので、リクエストは速くなければなりません。おかげさまで

+2

は、固定された箱の数ですか? –

+0

はい。 3つのボックスと3つのレベルのみ。ありがとう。 – user889349

答えて

2

もっと効率的な方法や集計を必要としない方法があるかもしれませんが、これを行うべきだと思います。

:当初、私はこの要件を誤解していました。 COUNT()MAX()集計を変更:

SELECT 
    CONCAT('level', level) AS levelname, 
    COUNT(CASE WHEN box = 1 THEN box ELSE NULL END) AS box1, 
    COUNT(CASE WHEN box = 2 THEN box ELSE NULL END) AS box2, 
    COUNT(CASE WHEN box = 3 THEN box ELSE NULL END) AS box3 
FROM tbl 
GROUP BY levelname 

JOINの使用して別の方法:

SELECT 
    CONCAT('level', a.level) AS levelname, 
    b1.num AS box1, 
    b2.num AS box2, 
    b3.num AS box3 
FROM 
    table a 
    LEFT JOIN (SELECT level, COUNT(*) AS num FROM table WHERE box = 1) b1 ON a.level = b1.level 
    LEFT JOIN (SELECT level, COUNT(*) AS num FROM table WHERE box = 2) b2 ON a.level = b2.level 
    LEFT JOIN (SELECT level, COUNT(*) AS num FROM table WHERE box = 3) b3 ON a.level = b3.level 
+0

MAX()ではなくCOUNT()を使用しませんか? – CAbbott

+0

@CAbbott重複がないかどうかは関係ありません。しかし、サンプルデータに現れるようなダプルがあると、 'SUM()'は別の結果セットを返します。例えば、レベル2のボックス3の値は 'SUM()'では6になりますが、 'MAX()'では3になります。 –

+0

@CAbbott実際、私は要件を誤解しました。それは 'COUNT()'でなければなりません。 –

関連する問題