以下の様なデータベース(MYSQL)の構造になっている時に、各社の平均収入(income)のランク付けができるSQLを教えてください。
+---------+----------------+
| name | income |
+---------+----------------+
| C社 | 100|
| C社 | 30|
| C社 | 50|
| B社 | 70|
| A社 | 60|
| A社 | 50|
+---------+----------------+
結果
name income rank
A社 55 3位
B社 70 1位
C社 60 2位
また、A社とB社が同収入など、順位にタイが出た場合にも対応できるような方法を求めています。
SQLだけでなく、プログラム側(php)での操作を前提にしたものでも問題ありません。
よろしくお願いいたします。
PHP側での処理でも構わないなら、それこそjamisさんの過去の質問にある方法を使用すれば、わかりやすくできますよ。
まずは
SELECT * FROM tbl GROUP BY name
でグループ分けしておいて。
後は
http://q.hatena.ne.jp/1391162718
のいずれかの方法を使えば、思い通りの結果になるはずです。
SQLでまとめることもできるけど、少々ややこしいので私ならPHP側での処理を勧めますね。
グループでまとめて、PHPで順位付けすれば良いだけなので、そちらのほうが楽だと思います。
そんなに速度が変わらないなら、見やすくしておかないと、後で変更があったときなんかに困るんですよね。
そのレコード数が100万とかならPHPの方が遅くなると思うので、データベース側での処理が良いと思いますけど。
回答ありがとうございます。
2014/02/06 20:53:49グループ分けしてから、PHPで試してみたら、えらく簡単にできました。
データ量も多くないので、実行速度も全く問題なかったです。
まだまだ勉強が必要ですね。