本文共 1253 字,大约阅读时间需要 4 分钟。
今天为写一条SQL困扰了很久
首先先贴两条sql,大家看看有啥区别
select * from all_txt A where id=(SELECT id from all_txt
where A.key_value = key_value ORDER BY release_time DESC limit 1);
select * from (select *,max(release_time) as timea
from all_txt group by key_value order by release_time desc) a order by timea desc;
然后说明下表的重要字段为三个id,key_value,release_time
作用是取每个相同key_value中release_time最新的数据 所有的数据为id key_value release_time1 001 2007-11-012 001 2007-11-023 001 2007-11-034 002 2007-11-045 002 2007-11-056 003 2007-11-067 004 2007-11-078 004 2007-11-089 005 2007-11-0910 005 2007-11-10现在要的结果为
id key_value release_time3 001 2007-11-035 002 2007-11-056 003 2007-11-068 004 2007-11-0810 005 2007-11-10针对这些数据,显示貌似都一样 但仔细研究下来就会发现 第二句 返回的会是
id key_value timea release_time3 001 2007-11-03 2007-11-015 002 2007-11-05 2007-11-046 003 2007-11-06 2007-11-068 004 2007-11-08 2007-11-0710 005 2007-11-10 2007-11-09
用max求出来的数据timea是没错,是上面的release_time,但真实的release_time却是不一样的,那证明取的数据不是最新的那条的,而是给我感觉取的是物理位置上的第一条,这样的话如果你还需要这张表的其他字段就会有问题。
说了半天有人会说,那你就用第一种吧,执行下你就会发现,性能太差了,而第二种就很快,本以为能用第二种的,哎~~~~可能是对group by的本质还是了解不是很透彻大家有啥更好的优化意见或方法,可以给我留言或加入qq群:47833489 讨论转载地址:http://mxbli.baihongyu.com/