首页  >  文章  >  数据库  >  如何在MySQL中检索每个会员的最后一次考勤记录?

如何在MySQL中检索每个会员的最后一次考勤记录?

Linda Hamilton
Linda Hamilton原创
2024-10-31 12:49:02269浏览

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