人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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


●質問者: jamis
●カテゴリ:学習・教育
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Sampo
●100ポイント ベストアンサー

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

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文を埋め込んだもののことを副問い合わせ(サブクエリ)といいます。この例は、サブクエリとしてはほんの簡単なものです。凝り出すといくらでも病的なやつが書けてしまいます。


jamisさんのコメント
ありがとうございます。 なるほど、教科の「sub」とテーブル名の「sub」が一緒だったので構造が掴みきれませんでした。「main」に対する「sub」なんですね。 理解できました。

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

jamisさんのコメント
いえいえ、ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ