擷取最新的使用者簽入/簽出資料
資料庫表通常儲存使用者簽入和簽出時間戳記。 僅檢索每個使用者的最新條目需要仔細建立查詢。 幼稚的方法可能會產生重複的結果。
解決資料重複問題
考慮這個初步嘗試:
<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」狀態如何,此查詢更可取:
<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
自動遞增,因此代表最新條目。
透過使用這些精細化查詢,您可以準確地檢索每個使用者最近的簽入/簽出數據,而無需冗餘資訊。 最後兩個查詢之間的選擇取決於您在確定最新記錄時是否需要考慮“in”或“out”狀態。
以上是如何檢索資料庫中每個使用者最近的簽入/簽出記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!