ホームページ >データベース >mysql チュートリアル >データベース内の各ユーザーの最新のレコードを効率的に選択するにはどうすればよいですか?
頻繁に行われるデータベース タスクには、一意のユーザーごとに最新のエントリを選択することが含まれます。 ユーザーのチェックイン時間とチェックアウト時間を追跡する 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 サイトの他の関連記事を参照してください。