首頁  >  文章  >  資料庫  >  如何在MySQL中檢索每位會員的最後一次考勤記錄?

如何在MySQL中檢索每位會員的最後一次考勤記錄?

Linda Hamilton
Linda Hamilton原創
2024-10-31 12:49:02267瀏覽

How to Retrieve the Last Attendance Record for Each Member in MySQL?

使用MySQL 選擇每個群組的最後一個值

簡介

在您的MySQL 表中,您有有關事件的資料出勤,並且您想要檢索每個成員的最後一次出勤記錄。儘管使用了 GROUP BY 子句,您還是遇到了選擇第一個出席而不是最後一個出席的問題。讓我們探討一下如何解決這個問題。

使用子查詢和ORDER BY

一種方法是使用子查詢和ORDER BY 來選擇每個成員的最後一次出勤情況:

SELECT id_branch_channel, id_member, attendance, timestamp, id_member
FROM (
    SELECT *
    FROM view_event_attendance
    ORDER BY timestamp DESC
) AS t1
WHERE id_event = 782
GROUP BY id_event, id_member;

此查詢從view_event_attendance 表中檢索所有行,並按時間戳降序排列它們(即最近的在前),然後使用子查詢作為主查詢的來源。 GROUP BY 子句用於按成員對結果進行分組並選擇最後一次出勤。

使用子查詢進行JOIN

另一個選項是使用帶有子查詢的JOIN查找每個成員的最大時間戳:

SELECT 
    t1.id_branch_channel,
    t1.id_member, 
    t1.attendance, 
    t1.timestamp,
    t1.id_member
FROM view_event_attendance AS t1
JOIN (
    SELECT id_member, MAX(timestamp) AS max_timestamp
    FROM view_event_attendance
    GROUP BY id_member
) AS t2 ON t1.id_member = t2.id_member AND t1.timestamp = t2.max_timestamp
WHERE t1.id_event = 782;

在此查詢中,view_event_attendance 表別名為t1,並與計算每個成員的最大時間戳記的子查詢(別名為t2)連接。 JOIN 條件根據成員 ID 和最大時間戳記匹配行,確保結果中僅包含每個成員的最後一次出席。

使用自訂聚合和子字串

更有效的解決方案是使用自訂聚合和子字串而不是子查詢:

SELECT id_branch_channel, id_member, 
    substring(max(concat(from_unixtime(timestamp), attendance)) from 20) as attendance
FROM view_event_attendance
WHERE id_event = 782
GROUP BY id_event, id_member;

此查詢將時間戳記和出勤率組合成每行的單一字串,並使用max() 來選擇每個成員組內的最大值。然後,substring() 函數會提取連接字串的出勤部分。這種方法避免了與子查詢相關的效能開銷。

以上是如何在MySQL中檢索每位會員的最後一次考勤記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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