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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-13 12:46:44374瀏覽

How to Retrieve the Most Recent Check-in/Out Time for Each User in a Database?

提取每位使用者最近的入住/退房時間

問題陳述:

任務是建立一個資料庫視圖,顯示每個使用者最近的簽入/簽出時間,包括lms_attendance表中對應的「簽入」或「簽出」狀態。

初始方法及其限制:

最初嘗試在使用者和「進/出」狀態(GROUP BY 欄位)上使用 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>

有效的解決方案:

提出了兩種解決方案來解決此問題:

解1:處理多個最大時間:

此查詢傳回代表每個使用者最新時間戳記的所有行,即使多個記錄共享相同的最大時間:

<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>

解決方案 2:保證每個使用者一行:

如果每個使用者只需要一筆記錄,無論潛在的重複最大次數是多少,此查詢更可取。它選擇具有最高 ID 的記錄(假設 id 自動遞增,反映最新條目):

<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.time DESC, t2.id DESC
                 LIMIT 1)</code>

此修改後的查詢使用 ORDER BY t2.time DESC, t2.id DESC 優先考慮最晚時間,然後在出現平局時優先考慮最高 ID,確保每個用戶獲得單一、明確的結果。

以上是如何檢索資料庫中每個使用者最近的簽入/簽出時間?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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