提取最新的用户签入/签出数据
数据库表通常存储用户签入和签出时间戳。 仅检索每个用户的最新条目需要仔细构建查询。 幼稚的方法可能会产生重复的结果。
解决数据重复
考虑这个初步尝试:
<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中文网其他相关文章!