2

我试图在stackoverflow上搜索,谷歌。我主要看到我们使用最大值。但是,根据我的记录,它将有一千行,所以它会在完成之前花费很多时间。

基本上,我只想通过 datetime 或 unixtime 获取最新记录。

表记录,按日期时间 ASC 排序:

查询:select * from accounts order by datetime 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 对它们进行分组时,结果总是显示第一条记录。不是最新的,甚至按日期时间或 unixtime DESC 添加顺序

查询:select * from accounts group by user_id order by datetime DESC;

+----------+--------+---------------------+------------+
| 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() 的最佳方法是什么?

问候

4

3 回答 3

2

就像在大多数自动增量情况下一样,max(ID)它实际上是最近记录的更好指标max(datetime)。这样做的原因是唯一的自动增量是同时记录的决胜局。

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

警告是:

  1. 您喜欢准确性并关心数据质量
  2. 您关心项目创建的相对时间。如果可以且需要对日期时间进行修改,则使用日期时间列。
  3. 您的帐户表中有一个自动增量列(如上面描述的 ID)。选择 * 表示您不这样做,这太糟糕了。但是你可以加一个!

查询。我在此查询中调用了ID上面的列:accounts.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;
于 2013-05-09T03:24:27.247 回答
0

我遇到了同样的问题,我得到了Oliver Hanappi提供的解决方案的解决方案

于 2013-09-21T16:25:36.547 回答
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 明确表示这些值是不确定的。它们有时可能来自第一行,但不能保证这种行为。

于 2013-05-09T02:15:09.067 回答