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

MySQLの質問です。
GROUP BYでグループ化したレコードの中からレコード1つ丸ごと選択することは可能でしょうか?

例えばフィールド5つで構成されているDBをフィールド1でグループ化しフィールド2(日付などの時間を格納したフィールド)の最も新しいレコード(フィールド5つ全部)を各グループから抽出したいのですが思いつきません。

うまく説明ができないのですが、お分かりの方がいたら教えて下さい。

●質問者: black_kenchan
●カテゴリ:ウェブ制作
✍キーワード:dB GROUP MySQL グループ フィールド
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● maple-aria
●27ポイント

グループ化したそれぞれのグループの中で

一番新しいレコードをそのまま取得したいということでしょうか?

自己結合、というものを使用すればうまくいくかと思います。

SELECT *

FROM tabble_name AS original

INNER JOIN

( SELECT type, MAX(insert_date) AS insert_date

FROM table_name

GROUP BY type

) AS grouped

ON original.type = grouped.type

WHERE original.insert_date = grouped.insert_date

ORDER BY type

http://codezine.jp/a/article/aid/460.aspx


2 ● sho49cc
●27ポイント

状況が飲み込めませんが、こんな感じのことがやりたいのでしょうか。

もう少し具体的に書かれたほうが求める答に近づけそうです。

(最低でもCreate Table文くらいないと。出来ればサンプルデータも。)

SELECT t1.* FROM t t1

JOIN (SELECT field1,

MAX(field2) as field2_max

FROM t

GROUP BY field1) t2

ON t1.field1 = t2.field2

AND t1.field2 = t2.field2_max

もちろん、field1がある程度グルーピングする価値のある情報群で、

field2がグループ内である程度かぶらないという条件付きになります。

テストせず適当に描いたので動かないかもしれませんが、ニュアンス的なヒントになれば・・・。


3 ● chuken_kenkou
●26ポイント

MySQLのバージョンは、何でしょうか?

MySQL 4.1以降なら、次のようなSQLで、期待した結果を得られます。

<SQL例>c1の値毎に、c2の最大値を求め、その行のすべての列値を得る

SELECT *
 FROM t1 AS x
 WHERE c2=(SELECT MAX(c2)
 FROM t1
 WHERE x.c1=c1)


なお、MySQLでは、GROUP BY使用時のSELECTでの選択式について、拡張仕様を持っています。

次のSQLは、標準SQLを含め、多くの主要RDBMSでは文法エラーになりますが、MySQLでは文法エラーにならず、結果を返します。ただし、前提条件を満たしていないと、結果は保証されません。

SELECT c1,c2,c3,MAX(c4)
 FROM t1
 GROUP BY c1

上記のSQLの場合、c1でグループ化しているのに、c2とc3の列値を検索するような指定になっています。標準SQLでは、GROUP BYで指定した列か、MAX、COUNTなどの集計(集合)関数、定数しか指定できません。

MySQLの場合は、エラーとはならず、c1でグループ化することで、「c2とc3の値も一意になるなら指定してよい。そうでないなら、結果は保証しない」という仕様になっています。


MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.3.7.3 非表示のフィールドに対する GROUP BY

関連質問


●質問をもっと探す●



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