我见过类似的问题,但是,我找不到最佳的解决方案。我需要优化此查询。
itemid state_id timestamp
======================================================
1 1 2012-08-11 00:00:00
1 2 2012-08-12 00:00:00
1 3 2012-08-13 00:00:00
2 1 2012-08-10 00:00:00
2 2 2012-08-13 00:00:00 <=== lastest state_id =2
3 1 2012-08-10 00:00:00
3 2 2012-08-13 00:00:00
3 4 2012-08-15 00:00:00
4 1 2012-08-10 00:00:00
4 3 2012-08-13 00:00:00
4 2 2012-08-16 00:00:00 <=== lastest state_id =2
5 1 2012-08-16 00:00:00
我需要根据最新的时间戳和state_id = 2选择itemid。
我有这个查询http://sqlfiddle.com/#!2/a3d41/1/0,但是我认为它不是为大表优化的,有什么想法吗?谢谢!
SELECT *
FROM hops h
WHERE h.timestamp = (
SELECT MAX( h2.`timestamp` )
FROM hops h2
WHERE h.`itemid` = h2.`itemid` )
AND h.state_id = 2
SELECT * FROM hops a
inner join (SELECT itemid, MAX(timestamp) FROM hops group by itemid) b
ON a.itemid = b.itemid
where a.STATE_ID = 2
这将对子查询进行内部联接,该子查询实际上应仅选择与关联表中的MAX时间戳值关联的记录。
您将以这种方式选择较少的行,通过内部联接,该行将仅返回您在子查询中选择的行,但通过执行SELECT *指定结果输出
现在,您有了一个联接,而不是使用WHERE子句,这将使SQL引擎在表上执行查找的次数最小化。或表会扫描您所说的任何内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句