在此表中我有四列
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 它使用两个选择查询(子查询)。但我不想使用子查询。
有没有其他方法可以获得最新记录?
答案 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
所以你的服务器和数据库服务器没有太多负载。