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 |
+-------+------------+

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/10/15 21:35:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:KUROX No.1

回答回数3542ベストアンサー獲得回数140

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

SQLの最後に

ORDER BY id asc,date desc

をつける

id:kokoromo

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

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

2007/10/15 21:30:02
id:Mook No.2

回答回数1314ベストアンサー獲得回数393

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

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ではバージョンによっても仕様が異なるので、質問時にはお使いのバージョンを提示された方が良いかと思います。

  • id:KUROX
    質問の意味を理解しました。
  • id:KUROX
    select id,max(date) from test group by id order by id;

    MYSQLはmax関数を使えることをリファレンスで確認してますが
    実際の動作は別のDBで行ったので、MYSQLで動くかはわかりません。
    本当にすいません。

  • id:kokoromo
    あー、それだとできてしまいますね
    質問をやり直しさせていただきます。
  • id:kokoromo
    キャンセルでも質問は消えず、ポイントの送信もできないんですね、失礼いたしました。
  • id:Mook
    的外れな回答でしたしたのに(KUROXさんの2番煎じでしたし、テンポラリテーブルは条件外だと書かれていたのに見落としていました・・・。)、わざわざポイントをお送りいただいてすみません。

    リベンジしようと思ったのですが、質問に対する適切な解を思いつきませんでした。お役に立てずにすみません。
  • id:KUROX
    ポイント送信、ありがたくいただきておきます。
    本当にどうもありがとうございます。

    私も、意地になって考えてみたんですけど、
    サブクエリ(複問い合わせ系)はいらないという話なので
    思いつきませんでした。

    サブクエリタイプでSELECT発行しても
    ORACLEとかはあまり問題視しないので、それでベターな
    SQLになります。
    #ベストかどうかは不明

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

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

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

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