MySQL でグループ化する前にレコードを日付と時刻で並べ替える
タイムスタンプを含むテーブルを扱う場合、以下に基づいて情報を取得することが重要です。特定の時間枠。ただし、レコードを特定のフィールドでグループ化する前に日付と時刻で並べ替えると、MySQL で問題が発生する可能性があります。
次の表を考えてみましょう:
name date time tom | 2011-07-04 | 01:09:52 tom | 2011-07-04 | 01:09:52 mad | 2011-07-04 | 02:10:53 mad | 2009-06-03 | 00:01:01
名前でグループ化された最も古いレコードを取得するには、次のクエリは失敗します:
SELECT * ORDER BY date ASC, time ASC GROUP BY name
GROUP BY は ORDER BY の前に発生する必要があるため、このクエリは機能しません。ただし、並べ替え前にグループ化すると、古いレコードではなく新しい「狂った」レコードが最初に返されます。
この問題を解決するには、いくつかのアプローチが利用できます。
サブクエリ アプローチ:
SELECT * FROM ( SELECT * FROM table_name ORDER BY date ASC, time ASC ) AS sub GROUP BY name
このメソッドは、日付と時刻でレコードを並べ替えるサブクエリを作成し、その結果を名前でグループ化するために外部クエリに渡します。 GROUP BY はサブクエリで最初に一致したレコードを操作するため、各名前の最も古いレコードを取得します。
ROW_NUMBER() アプローチ:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date, time) AS row_num FROM table_name ) AS sub WHERE row_num = 1
ROW_NUMBER( ) 日付と時刻で並べ替えて、各名前パーティション内の各行に連続番号を割り当てます。 row_num = 1 のレコードのみを選択すると、各名前の最も古いレコードが選択されます。
MAX() サブクエリのアプローチ:
SELECT * FROM table_name WHERE (date, time) IN ( SELECT MAX(date) AS date, MAX(time) AS time FROM table_name GROUP BY name )
このクエリはサブクエリを使用して、各名前の最大の日付と時刻を選択します。これらの値に基づいてメイン クエリをフィルタリングすることにより、各名前の最も古いレコードが取得されます。
以上がMySQL でグループ化する前に日付と時刻でレコードを並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。