
お世話になります。
以下のようなデータが収められた、テーブル `test1` から
各教科(subject) の最高得点(score)とその名前(name)を取得したいのですが、
name | subject | score
-----+---------+-------
鈴木 | 国語 | 80
山本 | 国語 | 50
佐藤 | 国語 | 90
鈴木 | 英語 | 80
佐藤 | 英語 | 60
山本 | 英語 | 60
鈴木 | 数学 | 50
佐藤 | 数学 | 70
山本 | 数学 | 90
↓以下の結果取得したい
name | subject | score
-----+---------+-------
佐藤 | 国語 | 90
鈴木 | 英語 | 80
山本 | 数学 | 90
SELECT `name`,`subject`,MAX(score) AS score FROM `test1` GROUP BY `subject`;
のクエリだと以下の結果で期待する結果が取得できません。
name | subject | score
-----+---------+-------
鈴木 | 国語 | 90
鈴木 | 数学 | 90
鈴木 | 英語 | 80
どのようにすればいいのでしょうか?
教えていただければ助かります。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
まず考え方としては
・各教科ごとの最高点を取得する
・教科と最高点を条件に名前を取得する
とすれば良いのではないかと。
当方SQL Server使いなので記法が少々異なるかも知れませんが・・・
SELECT T.name, T.subject, T.score
FROM test1 as T
INNER JOIN
(SELECT subject, MAX(score) FROM test1 GROUP BY subject)
as T1 ON T.subject=T1.subject AND T.score=T1.score
テーブルT1として教科ごとの最高点を取得、その後テーブルTから
合致する名前を取得します。
ありがとうございます。
期待通りの結果を得ることができました。
ローカルのMySQL5.0の環境では、エラーとなるので
MAX(score) → MAX(score) AS score
とすることで動作しました。
SELECT T.name, T.subject, T.score
FROM test1 as T
INNER JOIN
(SELECT subject, MAX(score) AS score FROM test1 GROUP BY subject)
as T1 ON T.subject=T1.subject AND T.score=T1.score
No.3
- 回答日時:
別解です。
select a.*
from test1 a inner join
( select subject,max(score) score
from test1
group by subject ) b
on a.subject=b.subject and a.score=b.score;
select a.*
from test1 a
where not exists
( select 1 from test1 b
where a.subject = b.subject
and a.score < b.score );
ありがとうございます
期待通りの結果を取得できました。
別解の方法は、なにか他の結果を取得するときにも使えそうですね。
勉強になりました。
No.2
- 回答日時:
RDBMSは、ここのカテゴリ通りMySQLですか?
バージョンは?
MySQL 4.0以前・・・一部のジョイン、union、一時表などは実装済
MySQL 4.1・・・ジョインの拡張、サブクエリ、unicodeなどの実装。一部の仕様変更。
MySQL 5.0・・・ビュー、ストアドプロシジャ、トリガなどの実装。一部の仕様変更。
MySQLであれば、すぐに思いつくだけでも、上記のような大きな機能追加や仕様変更があります。
>のクエリだと以下の結果で期待する結果が取得できません。
テストデータが良かったということですね。
MySQL 4.1以降で実行可能なSQL例を示します。
select
*
from test1 as x
where score=(select
max(score)
from test1
where subject=x.subject)
ありがとうございます。
期待通りの結果が得られました。
質問する文章をまとめるので、バージョンを書くのを忘れてました。
テスト環境は、MySQL5.0でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLで数字の値のもののみを取...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
行と列の入れ替え検索(行は可...
-
SQLiteでソートした結果をファ...
-
sqlに記述できない文字
-
フラグをたてるってどういうこ...
-
【VB】セルが空になるまで処理...
-
オラクルのUPDATEで複数テーブル
-
UPDATEで既存のレコードに文字...
-
既存データをINSERT文にして出...
-
SQLサーバに対するSQL文で抽出...
-
テーブル定義書(Oracle) 【IX】...
-
追加クエリで重複データなしで...
-
UPDATEの更新前の値を取得したい
-
csvデータ不要列の削除をbatフ...
-
truncate tableを使って複数の...
-
テーブル名が可変の場合のクエ...
-
pandasでsqlite3にテーブル作成...
-
Access特定のテーブルを編集不...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLで数字の値のもののみを取...
-
集計でテストの各教科の最高得...
-
文字列を追加してUPDATEしたい
-
固定長のデータをmysqlで取り込...
-
datetime型で日付計算ができま...
-
mysql 正規表現について
-
コマンドからDB名に"-"を使う...
-
delete構文のつなげなんですが...
-
次の時間帯の勝率の合計を求め...
-
エラーをいくらチェックしてもD...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
SQLサーバに対するSQL文で抽出...
-
UPDATEで既存のレコードに文字...
-
エラーを起こす方法
-
truncate tableを使って複数の...
-
既存データをINSERT文にして出...
-
timestampのデータはどのように...
おすすめ情報