ホームページ >データベース >mysql チュートリアル >データベース内の各ユーザーの最新のチェックイン/アウト時刻を取得するにはどうすればよいですか?
問題の説明:
タスクは、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 サイトの他の関連記事を参照してください。