SELECT文の解説をお願いします。


こちらで
http://q.hatena.ne.jp/1373303099
順位づけ(同着処理あり)の方法を教えていただき、実際に実装できました。


+---------+----------------+
| sub | score | (順位)
+---------+----------------+
| 国語 | 100| (1)
| 算数 | 90| (2)
| 理科 | 90| (2)
| 社会 | 90| (2)
| 図工 | 70| (5)
| 体育 | 60| (6)
| 保健 | 60| (6)
+---------+----------------+


その最後に

SELECT sub,score,
(SELECT COUNT(*) FROM table AS sub WHERE sub.score > main.score) + 1 AS rank
FROM table AS main ORDER BY score DESC

とsql側での処理を教えていただき、いろいろと調べていたのですが、書いてある内容の意味が今ひとつ掴めません。

今後の参考にしたいので、理解できるように解説してもらえないでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/07/10 19:31:41
  • 終了:2013/07/10 21:31:14

ベストアンサー

id:Sampo No.1

Sampo回答回数556ベストアンサー獲得回数1042013/07/10 21:08:19

ポイント100pt

回答した本人です。
まず、

SELECT COUNT(*) FROM table WHERE score > 60

と書いて実行したらどんな結果が帰ってくるでしょう。
scoreが60より大きい行の数、5が帰ってくるはずです。

これ、こう言えます。
体育や保健から見た、自分よりもいい成績の教科の数、ですよね。
それって、(順位-1)のことです。

だからSQLで

SELECT sub,score,
(順位-1) + 1 AS rank
FROM table ORDER BY score DESC

的な問い合わせ方をすれば、各教科のレコードに順位をつけてあげることができるわけです。

では、順位を求めるSQLを教科全体を求めるSQLにそのまま埋め込んでいいのかですが、ちょっとだけ細工が必要です。tableが2回出てくることになるので、見分けるために"AS main", "AS sub"と別名をつけてあげる必要があります。

別名をつけるからこそ、main.score < sub.score みたいな比較式が書けます。

こうして書き上げたものが例のSQL文です。SQL文の中にSQL文を埋め込んだもののことを副問い合わせ(サブクエリ)といいます。この例は、サブクエリとしてはほんの簡単なものです。凝り出すといくらでも病的なやつが書けてしまいます。

他1件のコメントを見る
id:Sampo

あ、列名にsubがあった。完全に見落としてました。
これはいけないですね。わからないわけです。(もちろんMySQLもエラー出します)

2013/07/10 21:27:18
id:jamis

いえいえ、ありがとうございました。

2013/07/10 21:31:04

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません