ホームページ >データベース >mysql チュートリアル >データベース内のユーザーごとの最新のチェックイン/チェックアウト記録を取得するにはどうすればよいですか?

データベース内のユーザーごとの最新のチェックイン/チェックアウト記録を取得するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-13 12:51:42122ブラウズ

How to Retrieve the Most Recent Check-in/Check-out Record per User in a Database?

最新のユーザーのチェックイン/チェックアウト データの抽出

データベース テーブルには、ユーザーのチェックインとチェックアウトのタイムスタンプが保存されることがよくあります。 各ユーザーの最新のエントリのみを取得するには、慎重なクエリの構築が必要です。 単純なアプローチでは重複した結果が生じる可能性があります。

データ重複への対処

次の最初の試みを考えてみましょう:

<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>

このクエリは各ユーザーの最新時刻を検索しますが、異なる時刻に「in」と「out」の両方のエントリがある場合は、ユーザーごとに複数の行を返す可能性があります。

サブクエリ ソリューション

より堅牢なソリューションでは、サブクエリを使用して各ユーザーの最大タイムスタンプを正確に指定します。

<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 列に基づいて最新のレコードのみが表示されます。 ユーザーが同じ最新タイムスタンプを持つ「in」と「out」の両方のエントリを持っている場合、このクエリは両方を返すことに注意してください。

最新のレコードを優先(in/out問わず)

「in」または「out」ステータスに関係なく、ユーザーごとに 1 つのレコードのみが必要な場合は、次のクエリが推奨されます。

<code class="language-sql">SELECT t1.*
FROM lms_attendance t1
WHERE t1.id = (SELECT t2.id
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user            
                 ORDER BY t2.id DESC
                 LIMIT 1)</code>

このアプローチでは、id の自動インクリメントを前提として、最も高い id を持つレコードが選択され、したがって最新のエントリを表します。

これらの洗練されたクエリを使用すると、冗長な情報を使用せずに、各ユーザーの最新のチェックイン/チェックアウト データを正確に取得できます。 最後の 2 つのクエリのどちらを選択するかは、最新のレコードを決定するときに「in」ステータスと「out」ステータスのどちらを考慮する必要があるかによって決まります。

以上がデータベース内のユーザーごとの最新のチェックイン/チェックアウト記録を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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