挑战:
在包含时间戳和状态标志(“in”或“out”)的数据库表中有效地为每个用户选择最新记录可能很复杂,特别是当用户有多个条目共享相同的最新时间戳时。
方法:
使用两个不同的 SQL 查询解决了这个问题:
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>
输出:
ID | USER | TIME | IO |
---|---|---|---|
2 | 9 | 1370931664 | out |
3 | 6 | 1370932128 | out |
5 | 12 | 1370933037 | in |
2。查询单个匹配记录:
此查询仅返回每个用户的单个最新记录,在时间戳关系的情况下优先考虑最高 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>
输出:
ID | USER | TIME | IO |
---|---|---|---|
2 | 9 | 1370931664 | out |
3 | 6 | 1370932128 | out |
5 | 12 | 1370933037 | in |
说明:
MAX(time)
),然后检索与该时间戳匹配的所有条目。这可以处理多个记录具有相同最新时间戳的情况。ORDER BY time DESC, id DESC
优先考虑最新时间戳,然后是最高 ID,确保使用 LIMIT 1
.在这些查询之间进行选择取决于您是否需要具有最新时间戳的所有记录,还是仅需要每个用户的单个最新记录。 当只需要一条记录时,第二个查询提供了更简洁的解决方案。
以上是如何使用时间戳选择数据库中每个用户的最新行?的详细内容。更多信息请关注PHP中文网其他相关文章!