首页 > 数据库 > mysql教程 > 如何检索数据库中每个用户最近的签入/签出时间?

如何检索数据库中每个用户最近的签入/签出时间?

Mary-Kate Olsen
发布: 2025-01-13 12:46:44
原创
381 人浏览过

How to Retrieve the Most Recent Check-in/Out Time for Each User in a Database?

提取每个用户的最近入住/退房时间

问题陈述:

任务是创建一个数据库视图,显示每个用户最近的签入/签出时间,包括lms_attendance表中相应的“签入”或“签出”状态。

初始方法及其局限性:

最初尝试在用户和“进/出”状态(GROUP BY 列)上使用 io。此方法无法处理用户拥有多个具有相同最大时间戳的记录的情况,从而导致这些用户出现重复条目​​。 有缺陷的查询是:

<code class="language-sql">select 
    `lms_attendance`.`id` AS `id`,
    `lms_attendance`.`user` AS `user`,
    max(`lms_attendance`.`time`) AS `time`,
    `lms_attendance`.`io` AS `io` 
from `lms_attendance` 
group by 
    `lms_attendance`.`user`, 
    `lms_attendance`.`io`</code>
登录后复制

有效的解决方案:

提出了两种解决方案来解决此问题:

解决方案1:处理多个最大时间:

此查询返回代表每个用户最新时间戳的所有行,即使多个记录共享相同的最大时间:

<code class="language-sql">SELECT t1.*
FROM lms_attendance t1
WHERE t1.time = (SELECT MAX(t2.time)
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user)</code>
登录后复制

解决方案 2:保证每个用户一行:

如果每个用户只需要一条记录,无论潜在的重复最大次数是多少,此查询更可取。它选择具有最高 ID 的记录(假设 id 自动递增,反映最新条目):

<code class="language-sql">SELECT t1.*
FROM lms_attendance t1
WHERE t1.id = (SELECT t2.id
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user            
                 ORDER BY t2.time DESC, t2.id DESC
                 LIMIT 1)</code>
登录后复制

此修改后的查询使用 ORDER BY t2.time DESC, t2.id DESC 优先考虑最晚时间,然后在出现平局时优先考虑最高 ID,确保每个用户获得单一、明确的结果。

以上是如何检索数据库中每个用户最近的签入/签出时间?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板