ホームページ  >  記事  >  データベース  >  MySQL でグループ化する前に日付と時刻でレコードを並べ替えるにはどうすればよいですか?

MySQL でグループ化する前に日付と時刻でレコードを並べ替えるにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-30 06:24:28591ブラウズ

How to Sort Records by Date and Time Before Grouping in MySQL?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。