運動会で個人の成績が100点満点で評価されるとします。結果は以下の通り。
各生徒、一番得点の高い競技(複数可)を抽出したい場合はどうすれば良いでしょうか?
結果はこうなるはずです。
山田 高飛び 90点
山田 玉入れ 90点
鈴木 徒競走 85点
室伏 綱引き 100点
山田君が2つ抽出されているのが肝です。(最大値の取得が目的なので)
WHERE~INでサブクエリを使って抽出してみました。
1 2 3 | SELECT * FROM tb_score WHERE ( c_score ) IN ( SELECT MAX( c_score ) FROM tb_score GROUP BY c_name ) |
IN内のサブクエリはINDEXが効かないらしく、全く使えないほど遅くなりました。
そこで、最高点をINNER JOINしてWHEREで条件を付けました。
1 2 3 4 5 | SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX(c_score) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING (c_name) WHERE c_score = MAXSCORE |
表に、新しく”最高得点”という項目を増やして、その最高得点=そのカラムの得点であれば抽出という条件を付けるという具合です。
結果的に両方とも同じような事をしていますが、こちらの方が劇的に早かったのでメモしておきます。SQL難しい・・・orz
※運動会の例は実際にテーブルを作ってやってみたわけではないのでそのままだと動かないかもしれません。