当前位置: 首页 > 知识库问答 >
问题:

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

臧烨烁
2024-07-23

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

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

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

共有2个答案

时恩
2024-07-23

除了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

令狐和裕
2024-07-23

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

 类似资料:
  • 本文向大家介绍Mysql时间轴数据 获取同一天数据的前三条,包括了Mysql时间轴数据 获取同一天数据的前三条的使用技巧和注意事项,需要的朋友参考一下 创建表数据   添加数据省略   时间轴前2条数据 ps:下面看下MySQL 生成 时间轴 调用: 结果: 表结构: 总结 以上所述是小编给大家介绍的Mysql时间轴数据 获取同一天数据的前三条,希望对大家有所帮助,如果大家有任何疑问请给我留言,小

  • 本文向大家介绍计算从一个大数组中(如1万条数据)取出第一数据和最后一条数据的时间分别是多少?相关面试题,主要包含被问及计算从一个大数组中(如1万条数据)取出第一数据和最后一条数据的时间分别是多少?时的应答技巧和注意事项,需要的朋友参考一下

  • 我想显示每个机组成员、基本信息以及他们合同中的最新开始日期。使用我的基本查询,它会为每个合同返回一行,复制具有不同开始和结束日期的基本信息。我只需要每个人一行,带有最新的开始日期(如果他们还没有开始日期,则为null)。 我对分组和分区函数的理解有限。我为类似日期逆向工程的查询使用分区并创建临时表进行选择。最终我可以重用它,但它似乎比我们需要的更复杂。 我只需要每列显示一行。前5列将始终相同。最后

  • 本文向大家介绍一千万条数据的表, 如何分页查询?相关面试题,主要包含被问及一千万条数据的表, 如何分页查询?时的应答技巧和注意事项,需要的朋友参考一下 数据量过大的情况下, limit offset分页会由于扫描数据太多而越往后查询越慢. 可以配合当前页最后一条ID进行查询, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT}. 当然, 这种情况下ID必

  • 问题内容: 给定一个简单的表,其中包含以下数据: 我将如何编写查询以使用PostgreSQL返回行的最后一次丢失或成功连胜?在这种情况下,我正在寻找以下结果: 我猜答案是使用和分区语法,但是我似乎无法确定。 问题答案: 假设(您不知道) 恰好有两个不同的值:。 从最新条目最高的角度来说是连续的。 这样就可以了: 这会获得和的最新ID ,是第一个和两个中较早的ID 。因此,a获得相反结果的最后一项。

  • 问题内容: 在页面的页脚中,我想添加诸如“最后更新xx / xx / 200x”之类的内容,该日期为最后一次更新某些mySQL表的时间。 最好的方法是什么?有检索上次更新日期的功能吗?每次需要此值时都应该访问数据库吗? 问题答案: 在更高版本的MySQL中,您可以使用数据库来告诉您何时更新了另一个表: 当然,这确实意味着要打开与数据库的连接。 另一种选择是每当更新MySQL表时“触摸”特定文件: