dポイントプレゼントキャンペーン実施中!

アンケート結果を集計する効率の良いシンプルなSQLを教えて下さい。

MySQLで、以下の状態です。

テーブル名:hoge
カラム:id,kbn
id...auto
kbn...1~5

欲しい結果は、以下の状態です。
順位,kbn,count
1位,5,60ポイント
2位,3,45ポイント
2位,1,45ポイント
4位,4,30ポイント
5位,2,10ポイント

※位やポイントはプログラム側で付与するので不要です。

2位の様に同点の場合は同じ順位を表示し、3位を飛ばし順位を表示させたく思います。

どうぞ、よろしくお願い致します。

A 回答 (2件)

手っ取り早いのは一度ビューを作ることです。



//準備
create table hoge(id int not null auto_increment primary key,kbn int);
insert into hoge(kbn) values(1),(2),(3),(4),(5),(1),(1),(2),(4),(5),(3),(1),(2),(5),(5),(3),(2),(1);

//ビューの作成
create view vhoge as select kbn,count(*) as cnt from hoge group by kbn;

//集計
select kbn,cnt,(select count(*)+1 from vhoge as v2 where v1.cnt<v2.cnt) as rank from vhoge as v1 order by rank asc;

※もしビューを使いたくないのであればビューに書いたのと同様のSQLをそのまま書きます

select kbn,cnt,(select count(*)+1 from (select kbn,count(*) as cnt from hoge group by kbn) as v2 where v1.cnt<v2.cnt) as rank from (select kbn,count(*) as cnt from hoge group by kbn) as v1 order by rank asc
    • good
    • 0
この回答へのお礼

yambejp 様

ご回答ありがとうございます。

教えて頂きました、SQL(今回はビューを使わないタイプを利用させて頂きました)で意図する動きのプログラムが実装出来ました。

サンプルデータまで、作成して頂き誠にありがとうございました。

教えて頂いたSQLを1つ1つを理解し、今後の勉強にも役立てていこうと思います。

本当にありがとうございました。

お礼日時:2015/01/19 19:10

hogeテーブルにはカラムid,kbnしかありませんが


countはどうやって拾う仕様でしょうか?
例えばkbn=5がhogeテーブルに、60レコードあるということでしょうか?
その方法だとレコード数が0のデータは拾えませんが別途ユーザー(?)管理テーブルは
あるのでしょうか?

ランク付け自体は定番のSQLがありますので
countさえわかればそれほど難しくはないです

この回答への補足

ご回答ありがとうございます。

>例えばkbn=5がhogeテーブルに、60レコードあるということでしょうか?

お察しの通りでございます。kbnを引数にしinsertする仕様となっております。

kbn自体には、別途管理テーブルをもっていますが、今回はレコード数が0の場合は表示されなくても問題はありません。

情報が不足していて申し訳ありません。

SQLに関しては勉強中ですが急遽必要になってしまい、今の私の実力では実装できそうもありませんので、お手数ですが、お力添えを願いたく思います。

補足日時:2015/01/19 14:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!