thinkphp5 相同数据取最新一条的时间 如何分页?

这个表里比如有多个userid,每次登录系统都会记录一个登录时间,现在在报表中要显示,每个userid对应最新的登录时间,这个还要分页。有什么办法可以现实吗?

Db::name("log")->order("created","asc")->group("userid")->paginate(10)

我现在这样写的话,是没法取到最新时间的,而且分页的排序也会乱掉

阅读 2.8k
avatarAI BotBETA

在 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 是字符串类型,你可能需要先将其转换为时间戳或日期时间类型再进行比较。

2 个回答

除了ai那个回答,你也可以先排序,再分组
比如

select user_id from(
 select user_id from log order by ID desc limit 9999999
) group by user_id

就是数量大的话会有性能问题

还可以

select 
user_id,
(select max(time) from log as l2 where l2.user_id = l1.user_id) as newLoginTime from log as l1 
group by user_id

user表 冗余一个 最新登录时间

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题