質問: SQL グループの平均と順位の算出方法を教えてください。 以下の様なデータベース(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 でグループ分けしておいて。 後は のいずれかの方法を使えば、思い通りの結果になるはずです。 SQLでまとめることもできるけど、少々ややこしいので私ならPHP側での処理を勧めますね。 グループでまとめて、PHPで順位付けすれば良いだけなので、そちらのほうが楽だと思います。 そんなに速度が変わらないなら、見やすくしておかないと、後で変更があったときなんかに困るんですよね。 そのレコード数が100万とかならPHPの方が遅くなると思うので、データベース側での処理が良いと思いますけど。