SQLに関する質問です。下記のようなデータがあります。各name につき、num の一番大きな数字のを1行抽出したいのですが、SQL文(mysql4あたりでかけるSQL文)ではどうやって書くといいのでしょうか? プログラムに読み込めばなんでもありなんですが、SQLのレベルで可能ならやりたいのです。

name,num,text
犬,1,xxx
犬,2,yyy
犬,3,zzz
猫,1,aaa
猫,2,bbb
狸,1,111

結果は、このようになります。
犬,3,zzz
猫,2,bbb
狸,1,11

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/03/07 09:02:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:y-kawaz No.1

回答回数1422ベストアンサー獲得回数226

ポイント20pt

こんな感じでどうでしょう。

SELECT * FROM animals a1 WHERE num = (SELECT max(num) FROM animals a2 WHERE a1.name=a2.name);

http://q.hatena.ne.jp/answer

id:xxxyahho No.2

回答回数19ベストアンサー獲得回数2

ポイント20pt

http://q.hatena.ne.jp/

mysql へ hatena テーブルを作成し、確認しました。

mysql> select * from hatena;

+--------+------+------+

nam num txt

+--------+------+------+

dog 1 xxx
dog 2 yyy
dog 3 zzz
cat 1 aaa
cat 2 bbb
tanuki 1 111

+--------+------+------+

6 rows in set (0.00 sec)

mysql> select * from hatena a

-> where num in (select max(num) from hatena b where a.nam=b.nam)

-> ;

+------+------+------+

nam num txt

+------+------+------+

dog 3 zzz
cat 2 bbb
fox 3 111

+------+------+------+

3 rows in set (0.00 sec)

期待通りの結果が得られています。

id:chuken_kenkou No.3

回答回数722ベストアンサー獲得回数54

ポイント20pt

もし、MySQLが前提であるなら、MySQL4と言っても、MySQL 4.0と4.1では、実装方法がまったく異なってきます。

  • MySQL 4.0以前・・・一部のジョイン、union、一時表などは実装済
  • MySQL 4.1・・・ジョインの拡張、サブクエリ、unicode等の実装。一部の仕様変更
  • MySQL 5.0・・・ビュー、ストアロプロシジャ、トリガなどの実装

つまり、MySQL4といっても、MySQL 4.0では一時表などを使っての実装、MySQL 4.1ではサブクエリを使っての実装が考えられるのです。

MySQL 4.1以降なら、「max関数とgroup by」を使った実装が普通に考えられるのですが、私としては#1さんと同様に、相関サブクエリ(サブクエリから、外側のクエリを参照する。「外への参照」と呼ばれることもある)を指示します。

また、OracleやSQL Server 2005以降であれば、分析関数(over())を使った方が、性能を出せる場合もあります。


http://q.hatena.ne.jp/だみー

id:hu2 No.4

回答回数12ベストアンサー獲得回数0

ポイント20pt

ちょっとくどく(ある意味わかりやすく)書くと以下でしょうか。

SELECT *

FROM

animals r1

WHERE EXISTS (SELECT * FROM

(SELECT

name

,MAX(num) AS num

FROM

animals

GROUP BY

name) r2

WHERE

r1.name = r2.name

AND r1.num = r2.num)

/

http://dummy

id:pahoo No.5

回答回数5960ベストアンサー獲得回数633

ポイント20pt

こんな感じでどうでしょう。

たぶん、MySQL 4.0 系でも動くと思います。

select name,max(num),text as num from テーブル group by name;

参考サイト

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません