- ベストアンサー
min句のSQLを改造し二番目に小さいdata抽出
- min句のSQLを使用して最上位の教科を出すことができますが、2番目や3番目を抽出する方法がわかりませんでした。
- 質問内容は、生徒の成績の得意不得意を表すSQLを考えているが、min句の改造で2番目や3番目を抽出することができずに困っています。
- 当初はlimit句を使用して2番目や3番目の教科を取得しようとしましたが、うまくいかなかったため、min句を使用する方法を探して質問しました。しかし、まだ解決策が見つかっていません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>「kamedaの一番の得意科目(クラスでの相対順位が最上位)は英語で、クラス2位である」 >「kamedaの二番の得意科目は数学で、クラス4位である」 >「kamedaの三番の得意科目は国語で、クラス7位である」 とテーブルの更新内容が一致しなかったので、上記の結果を出すためのSELECT文です。 select t1.usr_id, t1.kyoka_name, count(t2.usr_id) + 1 my_rank,t1.kyoka_rank from ( select t1.usr_id, t1.kyoka_name,count(t2.usr_id) + 1 kyoka_rank from seiseki2 t1 left join seiseki2 t2 on (t1.usr_id <> t2.usr_id and t1.kyoka_name = t2.kyoka_name and t1.point < t2.point) group by t1.usr_id, t1.kyoka_name ) t1 left join ( select t1.usr_id, t1.kyoka_name,count(t2.usr_id) + 1 kyoka_rank from seiseki2 t1 left join seseki2 t2 on (t1.usr_id <> t2.usr_id and t1.kyoka_name = t2.kyoka_name and t1.point < t2.point) group by t1.usr_id, t1.kyoka_name ) t2 on (t1.usr_id = t2.usr_id and t1.kyoka_name <> t2.kyoka_name and t1.kyoka_rank > t2.kyoka_rank) group by t1.usr_id, t1.kyoka_name,t1.kyoka_rank order by usr_id,my_rank ; 全角スペースでインデントしてあります。 mysqlの文法に合っていない箇所は適宜修正してください。
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
たとえば別教科でランクが同じものをどちら得意と判断するのかなど 仕様のつめがあまそうですが、以下でどうでしょう。 create table usr_kyoka_rank(usr_id varchar(20) not null primary key,`数学` int,`国語` int,`英語` int); insert ignore into usr_kyoka_rank select usr_id ,sum((kyoka_name='数学')*rank) as `数学` ,sum((kyoka_name='国語')*rank) as `国語` ,sum((kyoka_name='英語')*rank) as `英語` FROM (SELECT (SELECT COUNT(*) +1 FROM seiseki2 AS t2 WHERE 1 and t1.point < t2.point and t1.kyoka_name=t2.kyoka_name ) AS RANK ,`t1`.* FROM seiseki2 AS t1) as t3 group by usr_id 集計されたusr_kyoka_rankテーブルを使って好きに判断してください
お礼
ありがとうございます。 この方法で順位のインサートが出来ました。 ありがとうございました!! お忙しい中、お時間を頂戴いたしましたこと深く御礼申し上げます。
お礼
ありがとうございます。 この方法で順位の確認が出来ました。 ありがとうございました!! お忙しい中、お時間を頂戴いたしましたこと深く御礼申し上げます。 当方の場合、大元のテーブルの関係上アップデート構文とする必要がありましたので、下記の形で1位を入力(アップデート)、limit構文を変更することにより2位、3位 と順にインサートすることといたしました。 UPDATE point_rank SET 1st_kyoka_name= (SELECT t3.kyoka_name FROM ( SELECT t1.usr_id, t1.kyoka_name, count( t2.usr_id ) +1 my_rank, t1.kyoka_rank FROM ( SELECT t1.usr_id, t1.kyoka_name, count( t2.usr_id ) +1 kyoka_rank FROM seiseki2 t1 LEFT JOIN seiseki2 t2 ON ( t1.usr_id <> t2.usr_id AND t1.kyoka_name = t2.kyoka_name AND t1.point < t2.point ) GROUP BY t1.usr_id, t1.kyoka_name )t1 LEFT JOIN ( SELECT t1.usr_id, t1.kyoka_name, count( t2.usr_id ) +1 kyoka_rank FROM seiseki2 t1 LEFT JOIN seiseki2 t2 ON ( t1.usr_id <> t2.usr_id AND t1.kyoka_name = t2.kyoka_name AND t1.point < t2.point ) GROUP BY t1.usr_id, t1.kyoka_name )t2 ON ( t1.usr_id = t2.usr_id AND t1.kyoka_name <> t2.kyoka_name AND t1.kyoka_rank > t2.kyoka_rank ) GROUP BY t1.usr_id, t1.kyoka_name, t1.kyoka_rank ORDER BY usr_id, my_rank ) AS t3 WHERE t3.usr_id = point_rank.p_usr_id ORDER BY t3.kyoka_rank ASC LIMIT 0 , 1), 1st_rank= (SELECT ( SELECT count( * ) +1 FROM seiseki2 AS t2 WHERE 1 AND t2.point > t1.point AND t2.kyoka_name = t1.kyoka_name ) AS rank FROM seiseki2 AS t1 WHERE t1.usr_id = point_rank.p_usr_id ORDER BY rank ASC LIMIT 0 , 1);