ホームページ >データベース >mysql チュートリアル >データベース内のユーザーごとの最新のチェックイン/チェックアウト記録を取得するにはどうすればよいですか?
最新のユーザーのチェックイン/チェックアウト データの抽出
データベース テーブルには、ユーザーのチェックインとチェックアウトのタイムスタンプが保存されることがよくあります。 各ユーザーの最新のエントリのみを取得するには、慎重なクエリの構築が必要です。 単純なアプローチでは重複した結果が生じる可能性があります。
データ重複への対処
次の最初の試みを考えてみましょう:
<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 サイトの他の関連記事を参照してください。