mysql:9025
From: Seiji Uramoto <Seiji Uramoto <uramoto@xxxxxxxxxx>>
Date: Fri, 19 Mar 2004 22:12:07 +0900
Subject: [mysql 09025] Re: GROUP BY ... で定義して最新のデータを取得したい
うらもとといいますが。 konet218@xxxxxxxxxx wrote: > 近藤と申します。 > SELECT NO, MESSAGE, DATE, count(NO) as count FROM sample_tb GROUP BY > DATE ORDER BY NO DESC > > として、「同一のDATEは複数取得せず、NOの一番大きい値のレコードを1つ > だけ取得したい」のです。 この SQL は、文法として正しくありません。 取得しようとしている NO, MESSAGE, DATE, count(NO) as count のうち、 DATE と count(NO)以外は、何が返って来るのか不定です。 Oracle ではあきらかなエラーになるはずだし、PostgreSQL でも エラーになったっけ?もしかしたら、動くかも。 しかし、NO や MESSAGE は、「同一グループ(DATE)内の 何を返せばいいのか、明示されていない」ために、 期待した値は返って来ません。 さらに、NO を出力しておきながら、NOの数を出す、というのは 矛盾しています。 この場合、count(DATE) になるかと。 > そこで疑問になったのですが、 > 「同一のDATEは複数取得せず、NOの一番大きい値のレコードを1つだけ取得したい」 > の、 > 「NOの一番大きい値のレコードを1つだけ取得したい」の条件はクリアするのでしょうか? そのままSQL文にすればいいかと。 「一番大きい値」は MAX関数です。 つまり、 「同一のDATEは複数取得せず、NOの一番大きい値のレコードを1つだけ 取得したい」 という、場合は SELECT max(NO) as maxno , DATE , count(DATE) as count FROM sample_tb GROUP BY DATE ORDER BY maxno DESC となります。 ただし、この構文では MESSAGEを取得することができませんので、 SQL で書く場合は、以下のようになります。 「DATE文で纏めたデータのうち、NOが一番大きいデータ の NO と MESSAGE」 つまり SELECT A.NO , A.MESSAGE , B.DATE , B.count FROM sample_tb AS A inner join (SELECT max(NO) as maxno , DATE , count(DATE) as count FROM sample_tb GROUP BY DATE ORDER BY maxno DESC ) AS B on A.NO = B.maxno and A.DATE = B.DATE <- これは不要かな。 というような記述になるはずです。 (未確認注意) 丸カッコで囲われた部分を VIEW にすれば、ある程度見やすい SQL文になるかと思いますが、MySQL には VIEW が無かったと 思いますので、別の手段を使うことになるかな。 丸カッコで囲われた部分を、テンポラリテーブルに格納することで すっきりした記述になると思います。 あとは、MySQLに詳しい人に任せた。
9023 2004-03-19 20:51 [<konet218@xxxxxxxxxx] GROUP BY ... で定義して最新のデータを取得したい -> 9025 2004-03-19 22:12 ┣[Seiji Uramoto <uramo] 9026 2004-03-19 22:43 ┗["UNO Shintaro" <uno@] 9027 2004-03-19 22:53 ┗[<konet218@xxxxxxxxxx]