我有一个mysql表,其中捕获了所有用户执行的签入活动的详细信息。下面是带有样本数据的结构。
表名: check_in
+-----------+--------------------+---------------------+
| 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秒才能完成执行.注意:这个表有数十万行.
select user_id, max(time) as last_check_in_at from check_in group by user_id发布于 2016-11-05 07:13:22
您的SQL查询在我看来是优化的。
速度慢的原因可能是您没有user_id和time列的索引。
尝试将以下索引添加到表中:
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所建议的)。
发布于 2016-11-05 06:14:11
只需使用order by
注意:-请不要使用time作为列名,因为它可能是保留的关键字在任何语言中
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 发布于 2016-11-05 07:20:46
您需要在查询中使用order。
请尝试此查询
select `user_id`,`time` as last_check_in_at from check_in group by user_id order by `time` DESC对我来说很管用。
https://stackoverflow.com/questions/40435005
复制相似问题