• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:順位を示すSQLをベースに文字項目の抽出)

kamedaの一番の得意科目(クラスでの相対順位が最上位)は英語で、クラス2位

このQ&Aのポイント
  • 順位を示すSQLをベースに文字項目の抽出
  • MySQL 5.5とCentOS6.3で生徒の成績の得意不得意を表すSQLを考えています
  • kamedaの一番の得意科目(クラスでの相対順位が最上位)は英語で、クラス2位であるということが分かるようにする予定です

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

惜しいところまで行ってるのだけど、1st_kyoka_name= kyoka_name WHERE では、point_rankに存在しないカラム名を指定していることになるので、不可です。 1st_rank をだすときの select 文に kyoka_name カラムを加えたなら、それを from 句にいれて、もう一つ外側に select query を作って、1カラム1行を返すsubqueryを1st_kyoka_nameに代入とする必要があります。 usr_id を指定するには、2つ外となるupdate対象行のカラムを直接指定できないので、t1用のwhere句や order by句 limit句もさらに外側へ出すことになります。 同順のがあると、どちらの教科名になるかは、実行時の運しだい。 select 文で、point_rank と同じカラム構成のデータが作れたら、全カラム一度に insert 可能なので、以下の文で、いけそうです。 INSERT INTO point_rank (p_usr_id, 1st_rank, 1st_kyoka_name ) SELECT d1.id , min(d1.rank) AS top_rank , (select GROUP_CONCAT( kyoka ) from (SELECT t1.usr_id as id , t1.kyoka_name as kyoka ,( SELECT count( * ) +1 FROM seiseki2 AS t2 WHERE t2.point > t1.point AND t2.kyoka_name = t1.kyoka_name ) AS rank FROM seiseki2 AS t1 ) as d2 where d2.id=d1.id and d2.rank= top_rank group by d2.id ) AS kyoka FROM ( select t1.usr_id as id ,( SELECT count( * ) +1 FROM seiseki2 AS t2 WHERE t2.point > t1.point AND t2.kyoka_name = t1.kyoka_name ) AS rank FROM seiseki2 AS t1 ) as d1 group by d1.id ; mysql 5.1 以降なら GROUP_CONCAT() が使えるので、その生徒において、トップとなる教科が複数あれば、カンマで連結して表示するようにしました。 あと、細かいことを言えば、seiseki2のtable で、kyoka_name にindexを付けた方が速くなるのだけど、mysql では、text型にはindex を貼れません。それほど長い文字列が入るとも思えないので、 varchar(20) などで十分では?

tajix14
質問者

お礼

ありがとうございます。 おかげさまで出来ました。 深く御礼申し上げます。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

済みません、最後に確認せずに、手前カラムのalias 使えたはずと書き換えたら、group関数の結果となるaliasは、次のsubquery d2内で参照出来なかった。 正しくは、以下 INSERT INTO point_rank (p_usr_id, 1st_rank, 1st_kyoka_name ) SELECT d1.id , min(d1.rank) AS top_rank , (select GROUP_CONCAT( kyoka ) from (SELECT t1.usr_id as id , t1.kyoka_name as kyoka ,( SELECT count( * ) +1 FROM seiseki2 AS t2 WHERE t2.point > t1.point AND t2.kyoka_name = t1.kyoka_name ) AS rank FROM seiseki2 AS t1 ) as d2 where d2.id=d1.id and d2.rank= min(d1.rank) group by d2.id ) AS kyoka FROM ( select t1.usr_id as id ,( SELECT count( * ) +1 FROM seiseki2 AS t2 WHERE t2.point > t1.point AND t2.kyoka_name = t1.kyoka_name ) AS rank FROM seiseki2 AS t1 ) as d1 group by d1.id ;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • min句のSQLを改造し二番目に小さいdata抽出

    2度目の質問となり恐縮しております。 生徒の成績の得意不得意をあらわすSQLを考えています。(mySQL 5.5 centOS6.3) テストの成績をもとに 「kamedaの一番の得意科目(クラスでの相対順位が最上位)は英語で、クラス2位である」 「kamedaの二番の得意科目は数学で、クラス4位である」 「kamedaの三番の得意科目は国語で、クラス7位である」 ということが分かるようにする予定です。 当初私が考えた案ではlimit句を使った方法を考えており、limit後の値を変更することにより2位、3位を出す予定でしたが、私の方法ではうまくいかなかったためこのサイトで質問をさせて頂いたところ、minを使った方法を紹介れました。 (私の質問方法が「クラスの最上位を求める」というように省略して記載していたためmin句での回答を頂くことになりました) この回答をベースに当方で2番目を抽出出来るよう改造に着手しましたがうまく出来ません。 ●min句ベースではminから2番目というものをどうしても取ることが出来ませんでした。 ●このmin句ベースのものをlimit句のSQLに改造しようとトライしたのですがどうしても改造することが出来ませんでした。 何度もこの場をお借りして恐縮ですがお知恵を拝借したくお願い申し上げます。 **************************************************** ベースとなるデータ CREATE table seiseki2 (usr_id TEXT,kyoka_name TEXT,point INT); CREATE table point_rank (p_usr_id TEXT,1st_kyoka_name TEXT,1st_rank INT); INSERT INTO seiseki2 (usr_id,kyoka_name,point) values ('kameda','数学',85),('suzuki','数学',71),('kaneko','数学',32),('yosida','数学',61),('tanita','数学',70),('suyama','数学',80),('kisida','数学',61),('komine','数学',99),('tomita','数学',89),('sugita','数学',75),('kameda','国語',80),('suzuki','国語',46),('kaneko','国語',52),('yosida','国語',89),('tanita','国語',77),('suyama','国語',67),('kisida','国語',81),('komine','国語',89),('tomita','国語',69),('sugita','国語',70),('kameda','英語',94),('suzuki','英語',86),('kaneko','英語',50),('yosida','英語',59),('tanita','英語',48),('suyama','英語',97),('kisida','英語',74),('komine','英語',82),('tomita','英語',59),('sugita','英語',60); INSERT INTO point_rank (p_usr_id,1st_kyoka_name,1st_rank) values ('kameda','',''),('suzuki','',''),('kaneko','',''),('yosida','',''),('tanita','',''),('suyama','',''),('kisida','',''),('komine','',''),('tomita','',''),('sugita','',''); ***************************************************** この場で回答頂きましたSQL 下記はmin句を使用して最上位の教科を出すことが出来ます。 今回の質問は下記を改良し、2番目の教科、3番目の教科を出したいと考えています INSERT INTO point_rank (p_usr_id, 1st_rank, 1st_kyoka_name ) SELECT d1.id , min(d1.rank) AS top_rank , (select GROUP_CONCAT( kyoka ) from (SELECT t1.usr_id as id , t1.kyoka_name as kyoka ,( SELECT count( * ) +1 FROM seiseki2 AS t2 WHERE t2.point > t1.point AND t2.kyoka_name = t1.kyoka_name ) AS rank FROM seiseki2 AS t1 ) as d2 where d2.id=d1.id and d2.rank= min(d1.rank) group by d2.id ) AS kyoka FROM ( select t1.usr_id as id ,( SELECT count( * ) +1 FROM seiseki2 AS t2 WHERE t2.point > t1.point AND t2.kyoka_name = t1.kyoka_name ) AS rank FROM seiseki2 AS t1 ) as d1 group by d1.id ; ********************************************* ご参考 私が当初考えたSQL 順位は出ますが教科が出せません UPDATE point_rank SET 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)

    • ベストアンサー
    • MySQL
  • mySQLでグループ別の順位を入力

    東京都の学校別のランクを作っています。 現在、name school pointまでは記載されています。 この後、SQL構文で、rank欄に学校内順位を入れ、city欄にtokyoを入れたいと考えています。 完成形は下記のようなものです。 (同点2位が2人いたら、いずれも2とし、その次の人は4となる) table name__school__city___point___rank kameda__1高__tokyo___345____ 1 suzuki__2高__tokyo___341____ 1 kaneko__3高__tokyo___332____ 1 yosida__2高__tokyo___321____ 2 tanita__1高__tokyo___310____ 2 suyama__1高__tokyo___310____ 2 kisida__2高__tokyo___301____ 3 komine__1高__tokyo___299____ 4 tomita__2高__tokyo___289____ 4 sugita__1高__tokyo___275____ 5 下記のreplace文を考えたのですが、学校別の順位ではなく全体順位の入力となってしまいます。 REPLACE INTO table(rank,city) SELECT ( SELECT COUNT(t2.poit) FROM table t2 WHERE t2.poitn > t1.point AND t2.school = t1.school GROUP BY t2.school ) + 1 AS rank,tokyo FROM table t1; 学校別の順位を入力するためにはどのように改良すればいいでしょうか? SQLはmySQL5.5 CentOS6.3です。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • Excelで順位をつけたい

     お世話になります。よろしくお願いいたします。    エクセルでの順位の付け方です。  例えば、  国語、数学の2教科のテストの結果で順位をつけるとします。     列A  列B   列C   列D 行1      国語   数学  合計点 行2  A君  40    60   100 行3  B君  50    50   100 行4  C君  60    40   100  上記のような結果の時に普通に「RANK」を使うと、3人全員が「一位」になりますが、  合計点が同じ場合は、国語の点数が良い者から、「一位・二位・三位」になるようにしたいのです。  したがって、C君が「一位」・B君が「二位」・A君が「三位」になるようにするには、 どのようにすればよろしいですか?お教えください。

  • かっこで順位をつけることはできますか?

        国語  数学 鈴木  80  50 田中  60  90 みたいなデータがあるとします。 RANK関数を使って別のセルに1位とか2位とか表示するのは簡単ですが、 そうではなく鈴木の国語のところで「80(1)」とすることは可能ですか? 同じセルの中で、かっこを使って順位を表示させたいんです。 鈴木の数学は「50(2)」となって、田中の国語は「60(2)」となる、みたいに。     国語   数学 鈴木  80(1)  50(2) 田中  60(2)  90(1) そういうのはエクセルではできないでしょうか。 アドバイスよろしくお願い致します。

  • SQLの書き方

    わからないので質問をさせて頂きます。 テーブルAに、money、rank、name、IDと言うカラムがあります。 テーブルBに、IDとpointと言うカラム名があります。 テーブルAのIDを指定し、テーブルBに同じIDが存在する場合 テーブルAとBの値を取得するSQLを書いています。 Select テーブルA.money,テーブルA.rank テーブルA.name,テーブルA.ID,テーブルB.point FROM テーブルA,テーブルB Where テーブルA.ID = '5'; このように書くとmoney,rank,name、IDは重複して表示がされ pointに関してはすべてのpointが表示されてしまいます…。 重複するのでdistinctを使ったのですが うまくいかず…。 SQL初心者ですが、よろしければ教えてください。

    • ベストアンサー
    • MySQL
  • 順位が上がる方法

    バレンタインデーの日に学年末試験があります。 順位を上げたいのですがなかなか上がりません。 上げる方法を教えて下さい(詳しく) 教科 国語 数学 理科 社会 英語 音楽 美術 家庭&技術 英会話 聖書 です

  • accessで順位の合計の順位の求め方

    [T_成績]というテーブルの中に    フィールド名:[出席番号]    フィールド名:[得点] というフィールドがあるとします。 まず、新規にクエリーを作ります。これはただの選択クエリーで、[T_成績]テーブルを1個だけ追加します。 クエリーグリッドのフィールド欄に[出席番号]と[得点]を追加します。 最後のフィールドに順位を求める式を入力します。式は以下の通りです。   順位: (select count(*) from T_成績 as T_成績_1 where T_成績_1!得点>T_成績!得点)+1 こうすれば順位が求められるのですが例えば国語と数学と英語の順位の合計の低い順に順番を求めたいのですが(単純に合計の順位ならでるのですが)、順位の合計の順位というものがうまくいきません。本当に困っていますまる3日いろいろ試したのですがうまくいきません。今日も徹夜でした、よろしくお願いします。

  • 成績表について

    中学生の子供が成績表を持って帰ったのですが教科別順位で国語57位、社会53位、数学57位、理科45位、英語58位、総合順位64位でした。 ふと教科別順位の最低順位より総合順位の方が低い事はあるのかな?と思い質問しました。 考えてみたのですが分からなかったので宜しければ教えて下さい。

  • 同じ項目よりデータを取得する

    はじめまして。 初心者でまだよく理解できていないのですが、 よろしくお願いします。 教えていただきたいことは テーブル 受講履歴 出席番号 氏名 教科1 教科2 教科3   ―――――――――――――――――――  1001    山田    2    3    5  1002    武田    4    2     1003    斎藤    5    1      1004    山本    5    3    2  1005    鈴木    3    1     テーブル 教科 教科ID 教科名 ―――――――   1   国語   2   数学   3   理科   4   社会   5   音楽 といったテーブルがあったときに、出席番号を指定すると 氏名、教科1、教科2、教科3を取得するSQLを教えて頂きたいです。 たとえば出席番号1002にした場合、  氏名 教科1 教科2 教科3 ――――――――――――――  武田  社会  数学 といった感じです。 よろしくお願いします。

  • MySQLで複数のSELECT文を1文にまとめたい

    以下のようなテーブル table1 があります。 ******************* table1 ******************* Name, Kyouka, Score, ID ******************* 山田, 国語, 92, 10001 鈴木, 国語, 71, 10002 田中, 国語, 89, 10003 山田, 数学, 65, 10004 鈴木, 数学, 69, 10005 杉田, 英語, 96, 10006 山田, 英語, 63, 10007 田中, 英語, 76, 10008 ... ******************* カラムIDはPRIMARYを指定しています。 カラムScoreはインデックスを作成しています。 このテーブルで、「IDと教科」を指定したときに、以下の2つのデータを得たいと思っています。 (1) IDに対応する名前と、その教科中の順位 (2) その教科のレコード数 具体例としては、例えば「ID=10001、教科=国語」を指定したときに、「山田、3人中1位」というような情報が得たいです。 (「ID=10001、教科=英語」のようなおかしな組み合わせは指定しないようになっています。) (1) は、以下のようにして名前と順位を得る事が出来ました。 SELECT Name, (SELECT COUNT(*) + 1 FROM table1 b WHERE b.Score > a.Score and Kyouka='国語') AS rank FROM table1 a WHERE ID='10001' ORDER BY Score DESC; (2)は、以下のようにして特定の教科のレコード数を得る事が出来ました。 SELECT COUNT(*) FROM table1 WHERE Kyouka='国語'; しかし、実際にはレコード数が大量にあり、頻繁にこの検索を実行する予定なので、負荷が心配です。 出来るだけサーバーの負荷を減らすために、1回のSELECT文の実行で(1)と(2)をどちらも実現できるような方法はないでしょうか。 また、このテーブルでインデックスを作成しているのはIDとScoreのみですが、より負荷を減らすにはKyoukaにもインデックスを作成した方が良いでしょうか。 何卒、よろしくお願いいたします。

    • ベストアンサー
    • MySQL