我有一张这样的表:
+----+----+---------------------+---------------+
|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 |
答案 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)
上有一个索引。