ホームページ >データベース >mysql チュートリアル >データベース内の各ユーザーの最新のレコードを効率的に選択するにはどうすればよいですか?

データベース内の各ユーザーの最新のレコードを効率的に選択するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-13 12:56:44529ブラウズ

How to Efficiently Select the Most Recent Record for Each User in a Database?

各ユーザーの最新レコードの取得

頻繁に行われるデータベース タスクには、一意のユーザーごとに最新のエントリを選択することが含まれます。 ユーザーのチェックイン時間とチェックアウト時間を追跡する lms_attendance テーブルについて考えてみましょう。

課題: 最新のエントリを見つける

lms_attendance テーブル構造は次のとおりです:

id user time io
1 9 1370931202 out
2 9 1370931664 out
3 6 1370932128 out
4 12 1370932128 out
5 12 1370933037 in

私たちの目標は、各ユーザーの最新のレコードのみを返し、現在の io ステータス (インまたはアウト) を正確に反映するクエリを生成することです。

シンプルな (ただし欠陥のある) アプローチ

単純なアプローチは次のようになります:

<code class="language-sql">select 
    `lms_attendance`.`id` AS `id`,
    `lms_attendance`.`user` AS `user`,
    max(`lms_attendance`.`time`) AS `time`,
    `lms_attendance`.`io` AS `io` 
from `lms_attendance` 
group by 
    `lms_attendance`.`user`, 
    `lms_attendance`.`io`</code>

しかし、これは間違った結果を生成します:

id user time io
3 6 1370932128 out
1 9 1370931664 out
5 12 1370933037 in
4 12 1370932128 out

time は正しいですが、io ステータスが常に最新のタイムスタンプに関連付けられているとは限りません。

効果的な解決策: サブクエリの使用

解決策は、サブクエリを使用して各ユーザーの最大 time を識別することにあります。 改良されたクエリは次のとおりです:

<code class="language-sql">SELECT t1.*
FROM lms_attendance t1
WHERE t1.time = (SELECT MAX(t2.time)
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user)</code>

このクエリは、各ユーザーの最大 time を見つけるサブクエリとテーブルを効率的に結合します。 最新のタイムスタンプに一致するレコードのみが選択され、各ユーザーの最新エントリの正確な io ステータスが保証されます。

概要

サブクエリは、複雑なデータを取得するための強力なツールです。 この例は、データ分析とレポート作成にとって貴重な手法である、一意のユーザーごとに最新のレコードを効率的に選択する際の有効性を示しています。

以上がデータベース内の各ユーザーの最新のレコードを効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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