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

MySQL5で、group byの機能について質問です。group by を利用し、グループ化された集合の中であるカラム順にソートすることはできますか?もしくはgroup by を利用せずに同等の結果を出すことは可能でしょうか?ただし、サブクエリを利用したもの、テンポラリテーブルを利用したものはすでに実現できているため、利用しないものとします。以下に具体的なやりたいことの例を挙げます。

こういったデータがあります。
mysql> select * from test;
+-------+------------+
| id | date |
+-------+------------+
| room1 | 2007-10-01 |
| room1 | 2007-10-02 |
| room1 | 2007-10-03 |
| room2 | 2007-10-03 |
+-------+------------+

select * from test group by id;
とすると
+-------+------------+
| id | date |
+-------+------------+
| room1 | 2007-10-01 |
| room2 | 2007-10-03 |
+-------+------------+
この結果が返ってきますが、グループ化された集合の中で一番最初に見つかった行が返ってくるものだと思います。room1の最新日付は10/3ですが、それを出したいと思います。以下の結果になるようなSQLは書けますでしょうか?

+-------+------------+
| id | date |
+-------+------------+
| room1 | 2007-10-03 |
| room2 | 2007-10-03 |
+-------+------------+

●質問者: kokoromo
●カテゴリ:ウェブ制作
✍キーワード:GROUP MySQL SELECT SQL test
○ 状態 :キャンセル
└ 回答数 : 2/2件

▽最新の回答へ

1 ● KUROX

http://dev.mysql.com/doc/refman/4.1/ja/select.html

SQLの最後に

ORDER BY id asc,date desc

をつける

◎質問者からの返答

group byのうしろのorder by はgroup byした結果についての順番制御になります。2番目の表と結果が変わりません。

また、group by id asc,date desc とした場合でもdateがユニークになるためselectで表示する結果と変わりません(最初の返答はこちらと勘違いしていました)。


2 ● Mook

今回のケースに関して言えば、

SELECT id, max(date) FROM test GROUP BY id;

でどうでしょうか。


KUROX さんの参照先を読めば、KUROXさんの方法でもできそうなのですが、こちらで試したところだめでした。ただ、

SELECT * FROM test GROUP BY id ORDER BY id ASC, date DESC;

としても、表示されたのは2件でしたが。


項目を指定したくない場合、冗長ですがインラインビューを使用して

SELECT * FROM (SELECT * FROM test_c ORDER BY id ASC, dt DESC ) AS tmp GROUP BY id;

でも、ご希望の結果がでると思います。


蛇足ですが、DBではバージョンによっても仕様が異なるので、質問時にはお使いのバージョンを提示された方が良いかと思います。

関連質問


●質問をもっと探す●



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