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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-13 12:46:44375ブラウズ

How to Retrieve the Most Recent Check-in/Out Time for Each User in a Database?

ユーザーごとの最新のチェックイン/チェックアウト時刻の抽出

問題の説明:

タスクは、lms_attendance テーブルからの対応する「イン」または「アウト」ステータスを含む、各ユーザーの最新のチェックイン/チェックアウト時刻を表示するデータベース ビューを作成することです。

初期のアプローチとその制限:

最初の試行では、ユーザーと「in/out」ステータス (GROUP BY 列) の両方で 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>

効果的な解決策:

この問題に対処するための 2 つの解決策が示されています。

解決策 1: 複数の最大時間の処理:

このクエリは、複数のレコードが同じ最大時間を共有している場合でも、各ユーザーの最新のタイムスタンプを表すすべての行を返します。

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

解決策 2: ユーザーごとに 1 つの行を保証する:

重複する可能性のある最大回数に関係なく、ユーザーごとに 1 つのレコードのみが必要な場合は、このクエリが推奨されます。最も高い ID を持つレコードを選択します (id が自動インクリメントされ、最新のエントリが反映されると仮定します):

<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.time DESC, t2.id DESC
                 LIMIT 1)</code>

この改訂されたクエリでは、ORDER BY t2.time DESC, t2.id DESC を使用して最新の時刻を優先し、同点の場合は最も高い ID を優先し、ユーザーごとに単一の最終的な結果を保証します。

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

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