name,num,text
犬,1,xxx
犬,2,yyy
犬,3,zzz
猫,1,aaa
猫,2,bbb
狸,1,111
結果は、このようになります。
犬,3,zzz
猫,2,bbb
狸,1,11
こんな感じでどうでしょう。
SELECT * FROM animals a1 WHERE num = (SELECT max(num) FROM animals a2 WHERE a1.name=a2.name);
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)
期待通りの結果が得られています。
もし、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())を使った方が、性能を出せる場合もあります。
ちょっとくどく(ある意味わかりやすく)書くと以下でしょうか。
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)
/
こんな感じでどうでしょう。
たぶん、MySQL 4.0 系でも動くと思います。
select name,max(num),text as num from テーブル group by name;
コメント(0件)