首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从mysql中的表中提取最大值的最佳方法

从mysql中的表中提取最大值的最佳方法
EN

Stack Overflow用户
提问于 2016-11-05 05:13:39
回答 3查看 65关注 0票数 2

我有一个mysql表,其中捕获了所有用户执行的签入活动的详细信息。下面是带有样本数据的结构。

表名: check_in

代码语言:javascript
复制
+-----------+--------------------+---------------------+
|   id      |       user_id      |      time           |
+-----------+--------------------+---------------------+
|   1       |       10001        | 2016-04-02 12:04:02 |
|   2       |       10001        | 2016-04-02 11:04:02 |
|   3       |       10002        | 2016-10-27 23:56:17 |
|   4       |       10001        | 2016-04-02 10:04:02 |
|   5       |       10002        | 2016-10-27 22:56:17 |
|   6       |       10002        | 2016-10-27 21:56:17 |
+-----------+--------------------+---------------------+

在仪表板上,我必须显示每个用户以及他们最近的签入活动是在什么时候执行的(示例仪表板视图如下所示)。

用户1的最后一次入住是在2016-04-02 12:04:02。 用户2的最后一次入住是在2016-10-27 23:56:17。

编写查询以提取数据的最佳和有效方法是什么?我已经写了下面的查询,但它需要5-8秒才能完成执行.注意:这个表有数十万行.

代码语言:javascript
复制
select user_id, max(time) as last_check_in_at from check_in group by user_id
EN

回答 3

Stack Overflow用户

发布于 2016-11-05 07:13:22

您的SQL查询在我看来是优化的。

速度慢的原因可能是您没有user_idtime列的索引。

尝试将以下索引添加到表中:

代码语言:javascript
复制
ALTER TABLE `check_in` ADD INDEX `user_id` (`user_id`)
ALTER TABLE `check_in` ADD INDEX `time` (`time`)

然后再次执行SQL查询,以查看它是否会产生影响。

索引应该允许determine根据user_id快速地对相关记录进行分组,并快速确定最大time

索引还将有助于time快速排序数据(如Rajesh所建议的)。

票数 1
EN

Stack Overflow用户

发布于 2016-11-05 06:14:11

只需使用order by

注意:-请不要使用time作为列名,因为它可能是保留的关键字在任何语言中

代码语言:javascript
复制
  select chk.user_id user_id, chk.time as last_check_in_at from   
    check_in chk group by chk.user_id ORDER BY chk.time 
票数 0
EN

Stack Overflow用户

发布于 2016-11-05 07:20:46

您需要在查询中使用order。

请尝试此查询

代码语言:javascript
复制
select `user_id`,`time` as last_check_in_at from check_in group by user_id order by `time` DESC

对我来说很管用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40435005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档