こちらで
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側での処理を教えていただき、いろいろと調べていたのですが、書いてある内容の意味が今ひとつ掴めません。
今後の参考にしたいので、理解できるように解説してもらえないでしょうか?
回答した本人です。
まず、
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文を埋め込んだもののことを副問い合わせ(サブクエリ)といいます。この例は、サブクエリとしてはほんの簡単なものです。凝り出すといくらでも病的なやつが書けてしまいます。
あ、列名にsubがあった。完全に見落としてました。
2013/07/10 21:27:18これはいけないですね。わからないわけです。(もちろんMySQLもエラー出します)
いえいえ、ありがとうございました。
2013/07/10 21:31:04