一项常见的数据库任务涉及为每个唯一用户选择最新的条目。 考虑 lms_attendance
表,它跟踪用户签入和签出时间。
lms_attendance
表结构为:
id | user | time | io |
---|---|---|---|
1 | 9 | 1370931202 | out |
2 | 9 | 1370931664 | out |
3 | 6 | 1370932128 | out |
4 | 12 | 1370932128 | out |
5 | 12 | 1370933037 | in |
我们的目标是生成一个查询,仅返回每个用户的最新记录,准确反映他们当前的 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>
然而,这会产生错误的结果:
id | user | time | io |
---|---|---|---|
3 | 6 | 1370932128 | out |
1 | 9 | 1370931664 | out |
5 | 12 | 1370933037 | in |
4 | 12 | 1370932128 | out |
time
是正确的,但 io
状态并不总是与最近的时间戳相关联。
解决方案在于使用子查询来确定每个用户的最大值time
。 改进后的查询是:
<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
。 仅选择与最新时间戳匹配的记录,确保每个用户最近条目的io
状态准确。
子查询是复杂数据检索的强大工具。 此示例展示了它们在有效地选择每个唯一用户的最新记录方面的有效性,这是一种有价值的数据分析和报告技术。
以上是如何高效地为数据库中的每个用户选择最新记录?的详细内容。更多信息请关注PHP中文网其他相关文章!