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

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

DDD
DDD原创
2025-01-13 12:51:42131浏览

How to Retrieve the Most Recent Check-in/Check-out Record per User in a Database?

提取最新的用户签入/签出数据

数据库表通常存储用户签入和签出时间戳。 仅检索每个用户的最新条目需要仔细构建查询。 幼稚的方法可能会产生重复的结果。

解决数据重复

考虑这个初步尝试:

<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>

虽然此查询查找每个用户的最新时间,但如果每个用户在不同时间都有“in”和“out”条目,它可以返回每个用户的多行。

子查询解决方案

更强大的解决方案使用子查询来确定每个用户的最大时间戳:

<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>

这可以有效地过滤结果,仅显示基于每个用户的 time 列的最新记录。 请注意,如果用户同时拥有具有相同最新时间戳的“in”和“out”条目,则此查询将返回两者。

优先最新记录(无论'in'/'out')

如果每个用户只需要一条记录,无论“in”或“out”状态如何,此查询更可取:

<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.id DESC
                 LIMIT 1)</code>

此方法选择具有最高 id 的记录,假设 id 自动递增,因此代表最新条目。

通过使用这些精细化查询,您可以准确检索每个用户最近的签入/签出数据,而无需冗余信息。 最后两个查询之间的选择取决于您在确定最新记录时是否需要考虑“in”或“out”状态。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn