首頁 >資料庫 >mysql教程 >如何檢索資料庫中每個使用者最近的簽入/簽出記錄?

如何檢索資料庫中每個使用者最近的簽入/簽出記錄?

DDD
DDD原創
2025-01-13 12:51:42122瀏覽

How to Retrieve the Most Recent Check-in/Check-out Record per User in a Database?

擷取最新的使用者簽入/簽出資料

資料庫表通常儲存使用者簽入和簽出時間戳記。 僅檢索每個使用者的最新條目需要仔細建立查詢。 幼稚的方法可能會產生重複的結果。

解決資料重複問題

考慮這個初步嘗試:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn