- ベストアンサー
MySQLで変数やループ、上位3名を求める方法
- MySQLを使って変数やループを活用してデータベースから上位3名を求める方法について教えてください。
- 質問1では、増分を書き込むために新しい列を追加する方法を検討しています。
- 質問2では、すべての会員についてループさせる方法について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
仮にこうします monthは月の整数でもつと、年をまたいだ時に大変なので、日付型のデータの方がよいです //元データ create table score (id int not null primary key auto_increment, name varchar(20), score int, month date, increment int not null,unique(name,month)); insert into score(name,score,month) values ('taro',100,'2013-11-01') ,('jiro',200,'2013-11-01') ,('saburo',150,'2013-11-01') ,('hanako',200,'2013-11-01') ,('yosiko',160,'2013-11-01') ,('taro',50,'2013-10-01') ,('jiro',200,'2013-10-01') ,('saburo',250,'2013-10-01') ,('hanako',300,'2013-10-01') ,('yosiko',100,'2013-10-01'); //incrementを求める update score as s1 inner join score as s2 on s1.month + interval 1 month =s2.month and s1.name=s2.name set s2.increment=s2.score-s1.score; where s2.month='2013-11-01' //雑なランク付け select name,increment from score where month='2013-11-01' order by increment desc limit 3; ランク付けは同順位の処理をどうするか考えるとすこし複雑になってきますが 今回はとりあえず表示するだけの簡単な文法を提示しておきます
その他の回答 (1)
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
質問2 update score s1,score s2 set s1.increment=s1.score-s2.score where s1.month='11' and s2.month='10' and s2.name=s1.name 設問3 select concat(name,'さん'),concat(increment,'点') from score where month='11' order by increment desc limit 3;
お礼
ご回答、ありがとうございます。 #2の方と合わせて、同じ結果を求めるにも違う方法もあるのだと、ためになりました。 また、機会がございましたら、お願いいたします。 ありがとうございましたmm。
お礼
ご回答、ありがとうございます。 週末、ミックさんのサイト http://www.geocities.jp/mickindex/database/idx_database.html を見つけ、学習していました。 手続き型の通常の言語と異なり、 SQLは集合操作を意識した点が特色のようです。 発想の転換が求められる感じで、 いろいろ慣れない点もありますが、理解を深めていきたいと思います。 ご回答、ありがとうございましたmm