現在位置: よかブロ > 糟屋郡新宮町周辺の情報 > 私的日記 > 【MySQL】グループ内の最大値を取得するのにサブクエリを使うと遅すぎる

よかブロ
5月1日 20:06 - 新宮町 - 新宮町 ドアール美容室 【送迎サービス可】
勉強会〜

2012年9月5日 10:44 AM

【MySQL】グループ内の最大値を取得するのにサブクエリを使うと遅すぎる

記事のテーマ:私的日記

運動会で個人の成績が100点満点で評価されるとします。結果は以下の通り。
ex1

各生徒、一番得点の高い競技(複数可)を抽出したい場合はどうすれば良いでしょうか?

 

結果はこうなるはずです。

山田 高飛び 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

 

※運動会の例は実際にテーブルを作ってやってみたわけではないのでそのままだと動かないかもしれません。


にほんブログ村 地域生活(街) 九州ブログへ

あわせて読みたい