问题陈述:
任务是创建一个数据库视图,显示每个用户最近的签入/签出时间,包括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中文网其他相关文章!