簡介
在您的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中文網其他相關文章!