Mysql通过datetime或unixtime获取用户多行记录的最新记录
我试图在*上搜索google。我主要看到,我们使用最大。但是,在我的记录中,它将成千行,所以它会在完成之前吃掉很多时间。Mysql通过datetime或unixtime获取用户多行记录的最新记录
基本上,我只是想通过datetime或unixtime获取最新的记录。
表中的记录,通过日期时间ASC排序:
查询:SELECT * FROM占ORDER BY日期时间ASC;
+----------+--------+---------------------+------------+
| user_id | status | datetime | unixtime |
+----------+--------+---------------------+------------+
| 14254047 | 1 | 2013-03-27 01:25:12 | 1364343912 |
| 14254270 | 1 | 2013-03-27 09:36:58 | 1364373418 |
| 14254619 | 1 | 2013-03-27 16:07:04 | 1364396824 |
| 14254047 | 0 | 2013-05-08 07:20:39 | 1367990439 |
| 14254270 | 0 | 2013-05-09 04:01:36 | 1368064896 |
| 14254619 | 0 | 2013-05-09 04:01:36 | 1368064896 |
+----------+--------+---------------------+------------+
当我通过USER_ID分组它们,结果总是显示的第一条记录。不是最新的,由datetime或unixtime DESC甚至添加顺序
查询:按日期时间DESC USER_ID为了SELECT * FROM帐户组;
+----------+--------+---------------------+------------+
| user_id | status | datetime | unixtime |
+----------+--------+---------------------+------------+
| 14254047 | 1 | 2013-03-27 01:25:12 | 1364343912 |
| 14254270 | 1 | 2013-03-27 09:36:58 | 1364373418 |
| 14254619 | 1 | 2013-03-27 16:07:04 | 1364396824 |
+----------+--------+---------------------+------------+
我想要的结果如下:
+----------+--------+---------------------+------------+
| user_id | status | datetime | unixtime |
+----------+--------+---------------------+------------+
| 14254047 | 0 | 2013-05-08 07:20:39 | 1367990439 |
| 14254270 | 0 | 2013-05-09 04:01:36 | 1368064896 |
| 14254619 | 0 | 2013-05-09 04:01:36 | 1368064896 |
+----------+--------+---------------------+------------+
什么可能是最好的方法,不使用MAX()?
问候
正确的方法做,这是使用连接:
select a.*
from accounts a join
(select user_id, max(datetime) as maxdt
from accounts
group by user_id
) asum
on asum.user_id = a.user_id and a.datetime = asum.maxdt
order by datetime DESC;
你原来的查询使用MySQL的扩展,你可以有select
条款来看,这是不是在group by
列子句(或在聚合函数中)。当你这样做时,MySQL明确表示值为而不是确定。他们有时可能来自第一行,但这种行为不能保证。
与大多数自动增量情况一样,max(ID)
实际上是最近记录的更好指标,然后max(datetime)
是。这是因为独特的自动增量功能是同一时间记录中的决胜因素。
更好的是,那里有很多可能已经在自动增量列上有一个索引,所以如果可以的话使用这个。
的告诫是:
- 你喜欢的准确性和关心数据的质量,你关心的项目创建的相对时间
- 。如果对日期时间的修改是可能的并且是期望的,那么您使用日期时间列。
- 您的帐户表中有一个自动增量列(如上面描述的ID)。 select *表示你不会那么糟糕。但你可以添加一个!
查询。我打电话给在这上面的查询accounts.id
的ID
柱:
select a.*
from accounts a join
(select user_id, max(id) as maxid
from accounts
group by user_id
) asum
on asum.user_id = a.user_id and a.id = asum.maxid
order by a.id DESC;
datetime是我的标准的一部分的原因是,有一些后期/将来的记录,如果修改,将ID作为无效。 – 2013-05-09 04:53:24
这很好,也许这会帮助别人谁可以使用一个ID。仅供参考,问题中的select *表示账户中没有“ID”。 – gillyspy 2013-05-10 14:06:11
最多是否应始终使用?它需要一段时间才能完成上千行。 – 2013-05-09 02:20:15
@LouieMiranda。 。 。可能有其他的替代公式使用'存在',但它会是相同的想法。一千行不是很多行,所以性能应该不是什么大问题,除非你每秒钟多次运行这个查询。 – 2013-05-09 02:22:47