在如上图的表中,查询出每个cid的最大的date2对应的date1的值是什么。这个sql应该怎么写呢?不知道有没有表达清楚,就是每个cid要取出一个date1,条件是要查出每个cid分组中最大的date2对应的那个date1.如下图
解决方案 »
- 下的fastcgi x86的无法安装
- mysql分组查询金额如何同时查询全部总金额?
- EditPlus怎设置语法检查,根据网上配置了下,显示看不懂
- 帮我看个小问题,用户登录问题
- 急急!!关于mssql和mysql数据转换的问题,请大师帮助!!!!
- mssql联接一直出错
- Writing client-side GUI applications
- 急!!如何制作安装程序!100分
- qsnake & leemars 请来拿分
- 问问darkwing老兄,在php里如何重定向url
- soap问题 Webservice由JAVA AXIS2 (SOAP)生成。 php调用不了,有c#代码
- 基础PHP问题,如何显示正确的过桥数量
select a.cid,a.date1 from table a,(select cid,max(date2)date2 from table group by cid) b where a.cid = b.cid and a.date2 = b.date2
实际数据库中大概有4万多条记录。“zhangbin1988”这位朋友的的语句一运行就卡住了。
xuzuning版主的性能上要好一些,但是不太明白这个语句的原理。
select cid, date1 from (select * from 表 order by date2 desc) t group by cid order by cid
我的理解是:
1、在子查询中进行一遍排序,把date2值比较大的放到前面
2、按照cid进行分组
3、再按照cid排序
最关键的是第一步, 最后的“order by cid”是必须的吗?不知道理解的对不对?
2、按照cid进行分组
3、再按照cid排序是对的。
order by cid 可以不必须,因为已经 group by cid了。
cid不会重复。只是你的例子是要求按顺序,所以order by cid
由于你需要组中 date2 最大的,所以要对 date2 先行排序,以使组中最大的总是排在前面
因为表被排序了,cid 显然不是原来的次序了,所以才有最后的 order by cid你可以从该查询生成视图来提高检索的效率
或者将 date2 另表保存如果 date2 上有索引的话,应该不会产生临时文件
你可用 EXPLAIN 指令观察一下