这个表里比如有多个userid,每次登录系统都会记录一个登录时间,现在在报表中要显示,每个userid对应最新的登录时间,这个还要分页。有什么办法可以现实吗?
Db::name("log")->order("created","asc")->group("userid")->paginate(10)
我现在这样写的话,是没法取到最新时间的,而且分页的排序也会乱掉
这个表里比如有多个userid,每次登录系统都会记录一个登录时间,现在在报表中要显示,每个userid对应最新的登录时间,这个还要分页。有什么办法可以现实吗?
Db::name("log")->order("created","asc")->group("userid")->paginate(10)
我现在这样写的话,是没法取到最新时间的,而且分页的排序也会乱掉
在 ThinkPHP 5 中,要获取每个 userid
的最新登录时间并进行分页,你需要使用稍微不同的查询逻辑。因为直接使用 group("userid")
并不能保证你会得到每个组内的最新记录。
你可以使用子查询或 JOIN 操作来先找到每个 userid
的最新登录时间,然后再根据这些时间进行分页。
以下是一个使用子查询和 JOIN 的例子:
$subQuery = Db::name("log")->field("userid, MAX(created) as latest_time")->group("userid")->buildSql();
$list = Db::name("log")
->alias('l')
->join([$subQuery => 'lt'], 'l.userid = lt.userid AND l.created = lt.latest_time', 'INNER')
->field('l.userid, l.created as latest_login_time') // 选择你需要的字段
->order('l.created', 'desc') // 根据最新时间降序排序
->paginate(10); // 分页,每页10条
// 输出分页数据
foreach ($list as $item) {
// 处理每个条目
echo $item['userid'] . ' - ' . $item['latest_login_time'] . '<br>';
}
// 输出分页链接等
echo $list->render();
在上面的代码中,我们首先构建了一个子查询 $subQuery
,它查找每个 userid
的最新 created
时间。然后,我们将这个子查询与原始 log
表进行 JOIN 操作,以找到与这些时间匹配的完整记录。最后,我们根据这些记录的时间进行排序和分页。
注意:确保你的 created
字段是时间戳或日期时间类型,以便正确地进行比较和排序。如果 created
是字符串类型,你可能需要先将其转换为时间戳或日期时间类型再进行比较。
1 回答4.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答890 阅读✓ 已解决
1 回答582 阅读✓ 已解决
除了ai那个回答,你也可以先排序,再分组
比如
就是数量大的话会有性能问题
还可以