- ベストアンサー
グループ化したSQLの書き方について
- グループ化したSQLを使用して最高得点を取得する方法を教えてください。
- resultテーブルにはid、stpass、tokuten、branch、dateというフィールドがあります。
- 最高得点以外のフィールド(branch、date)も表示するSQLの書き方を知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
2つ以上の項目を出すならば、2つ目の構文(JOIN構文)を使わないと厳しいです。 少し長くなりますが、自己最高得点を2回以上マークすることもあると思うので、その場合は最新の日付を出しています。 select s.branchname,r.date,s.stuname,r.maxpercent from m_student s left outer join (select r1.stuid,max(r1.date) date,r1.percent maxpercent from result r1 where r1.percent in (select max(r2.percent) from result r2 where r2.stuid=r1.stuid) group by r1.stuid,r1.percent) r on r.stuid=s.stuid 標準構文とは言え、MySQLは手元にないので、別のDBMSでしか稼働確認していません。もし通らないようなら、MySQLカテゴリで識者を探す方が効率がいいかもしれません。 (経験上の得手不得手というのはありますので)
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
>SQL文はどの言語でも同じだと聞いています。 シンプルなSQL文についてはそのとおりです。しかし、実際のDBMSがすべてSQL標準に則った構文をサポートしているかというと、そうではありません。また、バージョンによってもサポート状況は変わります。 (MySQLとかは特にそうです) ご質問の件については、2つ例をあげます。 1) select s.stuname, (select max(tokuten) from result where id=s.stuid) maxtokuten from m_student s 2) select s.stuname,r.maxtokuten from m_student s left outer join (select id, max(tokuten) maxtokuten group by id) r on r.id=s.stuid stpassのフィールドの意味がわからないので、とりあえずm_studentのstuidとresultのidをJOINさせる前提で書いていますが、書き方のポイントはおわかりいただけるのではと思います。
お礼
ありがとうございました。 $sql="select s.branchname,s.stuname,(select max(percent) from result where stuid=s.stuid) maxpercent from m_student s"; で通りました。 教えていただいたtokutenは、実際はpercentです。わかりやすくする為に書きました。
補足
$sql="select s.branchname,s.stuname,(select max(percent) from result where stuid=s.stuid) maxpercent from m_student s"; では通るのですが、 $sql="select s.branchname,s.date,s.stuname,(select max(percent) from result where stuid=s.stuid) maxpercent from m_student s"; では、通りません。 エラーメッセージは Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in *** です。 テーブルのフィールドは result:id,cate_a_code,cate_b_code,course,stuid,stpass,date,percent,judgment,branch,branchname,stuname,stuyomi m_student:id,bankcode,stuid,stpass,stuname,stuyomi,d_from,d_to,branchname です。 resultテーブルの該当レコード(最高得点)のdateを表示させるSQLがわかりません。 初心者ですいません。
- jamshid6
- ベストアンサー率88% (591/669)
何のDBをお使いですか? 以下が動けば、目的は達すると思いますが。。 select * from result r where tokuten in (select max(tokuten) from result where id=r.id and stpass=r.stpass)
お礼
ACCESS上で確かに動きました。ありがとうございました。
補足
DBはMySQL5です。(言語PHP5) お教えいただいたSQLで動きました。 SQL文はどの言語でも同じだと聞いています。 以下はご存知の言語を基にしたお答えで結構です。 基本を教えていただいた所で、以下の事をやろうとしたのですが、 できません。 resultテーブルは、試験結果で、試験を受けた人の結果だけが入っています。 試験を受けていない人もいます。 全員(テーブル:m_student)の一覧と試験を受けた人を出したいのですが。 A氏:未受験 B氏:95点(何回か受けたうちの最高得点) C氏:60点(何回か受けたうちの最高得点) D氏:未受験 のように表示したいのですが。 テーブル:m_studentには、id,stuid(ID),stuname(氏名)のフィールドがあります。 1.left joinでresultテーブルとm_studentテーブルを結合 2.tokutenフィールドがある人は、その人の最高点を表示 3.tokutenフィールドがない人(m_studentにしか存在しない)は名前だけ表示 というSQLを書きたいのですが、思いつきません。 私は、ACCESS&VBAはある程度かじっていますが、ダイレクトにSQLを書くのは、 業務上では初めてです。(勉強は少ししたつもりですが) 説明が足りないかもしれません。 また、突拍子もない質問かもしれません。 恐れいります。よろしくお願いします。
お礼
これで動きました。 何から何までご指導いただき 大変ありがとうございました。 深く感謝いたします。