mysql通过timestamp获取最新记录而不使用子查询

时间:2013-11-29 06:46:50

标签: mysql sql timestamp greatest-n-per-group

在此表中我有四列

id   state_id   state        add_time
1       10         1        1385461144
2       12         3        1385461144
3       14         2        1385461144
4       12         5        1385461264
5       10         2        1385461264

我希望通过最后一个字段(add_time)获取最新记录

结果必须像这样

id   state_id   state        add_time
3       14         2        1385461144
4       12         5        1385461264
5       10         2        1385461264

我发现了这个问题get the records for the latest timestamp mysql 它使用两个选择查询(子查询)。但我不想使用子查询。

有没有其他方法可以获得最新记录?

3 个答案:

答案 0 :(得分:5)

有两种方法可以获得您正在寻找的结果。

左连接解决方​​案:

SELECT t1.* FROM t t1
LEFT JOIN t t2
ON t1.state_id = t2.state_id AND t1.add_time < t2.add_time
WHERE t2.add_time IS NULL

小提琴here

子查询解决方案:

SELECT t1.* FROM t t1
JOIN (
  SELECT state_id, max(add_time) add_time FROM t
  GROUP BY state_id
) t2
ON t1.state_id = t2.state_id AND t1.add_time = t2.add_time

小提琴here

两者都会输出:

| ID | STATE_ID | STATE |   ADD_TIME |
|----|----------|-------|------------|
|  3 |       14 |     2 | 1385461144 |
|  4 |       12 |     5 | 1385461264 |
|  5 |       10 |     2 | 1385461264 |

答案 1 :(得分:1)

当你在测试哪一个更快时,这是另一个尝试 http://sqlfiddle.com/#!2/760c73/13/0

SELECT id,state_id,state,add_time
  FROM t t1
 WHERE NOT EXISTS
      (SELECT 1 
       FROM t t2
       WHERE t2.state_id = t1.state_id
       AND t2.add_time > t1.add_time);

答案 2 :(得分:0)

如果要将数据与客户端(浏览器或应用程序)同步,则为每个调用设置一个参数,用于指定上一个同步时间(类似于lastSyncTime)并基于此查询数据库。对于第一个调用,在逻辑中设置参数lastSyncTime = 0,对于后续调用,使用MAX(ADD_TIME)。这些计算必须在您的客户端。在您的服务器中,您需要获取参数lastSyncTime并执行类似这样的查询

SELECT id, state_id, state, add_time FROM tabname WHERE add_time > lastSyncTime

所以你的服务器和数据库服务器没有太多负载。