人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: kaiketsu
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:AAA name SQL データ プログラム
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● y-kawaz
●20ポイント

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

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

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


2 ● xxxyahho
●20ポイント

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)

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


3 ● chuken_kenkou
●20ポイント

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

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

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

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


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


4 ● hu2
●20ポイント

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

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


5 ● pahoo
●20ポイント

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

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

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

参考サイト

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ