一項常見的資料庫任務涉及為每個唯一使用者選擇最新的條目。 考慮 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中文網其他相關文章!