2013-05-09 101 views
1

我试图在stackoverflow上搜索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()?

问候

回答

0

正确的方法做,这是使用连接:

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明确表示值为而不是确定。他们有时可能来自第一行,但这种行为不能保证。

+0

最多是否应始终使用?它需要一段时间才能完成上千行。 – 2013-05-09 02:20:15

+0

@LouieMiranda。 。 。可能有其他的替代公式使用'存在',但它会是相同的想法。一千行不是很多行,所以性能应该不是什么大问题,除非你每秒钟多次运行这个查询。 – 2013-05-09 02:22:47

1

与大多数自动增量情况一样,max(ID)实际上是最近记录的更好指标,然后max(datetime)是。这是因为独特的自动增量功能是同一时间记录中的决胜因素。

更好的是,那里有很多可能已经在自动增量列上有一个索引,所以如果可以的话使用这个。

的告诫是:

  1. 你喜欢的准确性和关心数据的质量,你关心的项目创建的相对时间
  2. 。如果对日期时间的修改是可能的并且是期望的,那么您使用日期时间列。
  3. 您的帐户表中有一个自动增量列(如上面描述的ID)。 select *表示你不会那么糟糕。但你可以添加一个!

查询。我打电话给在这上面的查询accounts.idID柱:

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; 
+0

datetime是我的标准的一部分的原因是,有一些后期/将来的记录,如果修改,将ID作为无效。 – 2013-05-09 04:53:24

+0

这很好,也许这会帮助别人谁可以使用一个ID。仅供参考,问题中的select *表示账户中没有“ID”。 – gillyspy 2013-05-10 14:06:11

0

我在同样的问题stucked,我得到了我的解决方案解决方案通过提供Oliver Hanappi