ホームページ > データベース > mysql チュートリアル > データベーステーブルの各グループの最新エントリを効率的に取得するにはどうすればよいですか?

データベーステーブルの各グループの最新エントリを効率的に取得するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-25 19:53:09
オリジナル
786 人が閲覧しました

How can I efficiently retrieve the latest entry for each group in a database table?

各グループの最新のエントリ

目標は、

のようなデータベーステーブルから各ユニークなグループの最新エントリを取得することです。このテーブルには、一連のドキュメントステータス変更レコードが含まれており、各ドキュメントは

で識別されます。タスクは、各ドキュメントの最新の更新ステータスとその関連付け日を抽出することです。 DocumentStatusLogs DocumentIDデータベースの標準化を検討してください

まず、データベース設計が正しく標準化されているかどうかを検討する必要があります。ステータス情報は、親テーブルまたはサブテーブルに保存する必要がありますか?各ドキュメントの現在の状態にのみアクセスする必要がある場合は、ステータスフィールドを親テーブルに直接追加して、個別のテーブルを使用してステータスの変更を追跡しないようにすることをお勧めします。ただし、州の更新の履歴記録を保持する必要がある場合は、州の変更を別のテーブルに維持することがより有利です。

トップエントリを取得

最初の問題に戻ると、各グループのトップエントリを直接取得するためのポリマー機能が構築されていません。したがって、必要な結果を達成するには、追加のクエリまたはサブQuerieを達成する必要があります。 お問い合わせcte

1つの方法は、パブリック式式(CTE)を作成して中間結果を生成することです。 の名前が付けられたCTEは、各エントリに行番号を追加することにより、元のテーブルを強化します。この行番号は各グループで生成され、

の下降順序に従って配置されます。 このクエリは、テーブルから1に等しい行番号(RN)がある行を選択し、各

グループの上部エントリを効果的に提供します。

cte代替方法DocumentIDDateCreated

別の方法は、特に各
<code class="language-sql">WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
   FROM DocumentStatusLogs
)
SELECT *
FROM cte
WHERE rn = 1</code>
ログイン後にコピー
が特定の日付に複数のエントリを持っている場合、

の代わりにcte関数を使用することです。 DocumentID特定の日付のすべてのエントリが同じランキングを取得することを保証します。

結論 上記のテクノロジーを使用することにより、各グループの最新のエントリを効果的に抽出して、サブクエリCTEを使用するか、

関数を使用できます。選択した方法は、データ要件とパフォーマンスの考慮事項によって異なります。

以上がデータベーステーブルの各グループの最新エントリを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート