MySQL选择分组和最新时间​​戳

时间:2014-02-05 18:52:17

标签: mysql group-by

我有一张这样的表:

+----+----+---------------------+---------------+
|lid |uid |timestamp            |token          |
|----+----+---------------------+---------------+
| 10 | 10 | 2014-02-03 12:17:18 | 52efcf118a0ba |
| 45 | 10 | 2014-02-03 12:51:13 | 52efd7046022d |
| 20 | 10 | 2014-02-04 03:47:59 | 52f0a931d3945 |
| 12 | 11 | 2014-02-04 05:21:57 | 52f0bf389371b |
| 34 | 11 | 2014-02-05 06:36:26 | 52f222384fe2d |
| 12 | 11 | 2014-02-05 07:06:42 | 52f229500b403 |
| 32 | 12 | 2014-02-04 05:21:57 | 52f0bf389371b |
| 55 | 12 | 2014-02-05 06:36:26 | 52f222384fe2d |
| 61 | 12 | 2014-02-05 07:06:42 | 52f229500b403 |

lid和uid是外键,表没有唯一的列。

我想选择使用最新时间戳对uid BUT进行分组的行。例如,从上面的数据我只想要这些行:

+----+----+---------------------+---------------+
|lid |uid |timestamp            |token          |
|----+----+---------------------+---------------+
| 20 | 10 | 2014-02-04 03:47:59 | 52f0a931d3945 |
| 12 | 11 | 2014-02-05 07:06:42 | 52f229500b403 |
| 61 | 12 | 2014-02-05 07:06:42 | 52f229500b403 |

1 个答案:

答案 0 :(得分:2)

这是MySQL中的一种典型方式:

select t.*
from table t
where not exists (select 1
                  from table t2
                  where t2.uid = t.uid and
                        t2.timestamp > t.timestamp
                 );

逻辑是:从表中获取所有行,其中没有与此时间戳相同的uid的时间戳。对于性能,您应该在table(uid, timestamp)上有一个索引。