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

Linda Hamilton
发布: 2024-10-31 12:49:02
原创
267 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!