简介
在您的 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中文网其他相关文章!