在如上图的表中,查询出每个cid的最大的date2对应的date1的值是什么。这个sql应该怎么写呢?不知道有没有表达清楚,就是每个cid要取出一个date1,条件是要查出每个cid分组中最大的date2对应的那个date1.如下图

解决方案 »

  1.   

    select cid, date1 from (select * from 表 order by date2 desc) t group by cid order by cid
      

  2.   


    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
      

  3.   

    感谢两位的帮助。
    实际数据库中大概有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”是必须的吗?不知道理解的对不对?
      

  4.   

    1、在子查询中进行一遍排序,把date2值比较大的放到前面
    2、按照cid进行分组
    3、再按照cid排序是对的。
    order by cid 可以不必须,因为已经 group by cid了。
    cid不会重复。只是你的例子是要求按顺序,所以order by cid
      

  5.   

    版主的意思是先对原表按照date2字段排序作为临时表,然后对临时表按照cid分组(得到每个cid分组里date2最大的那一行),最后按照cid排序,得到想要的date1
      

  6.   

    mysql 在分组时,对于非聚类列只取组中第一条记录的内容
    由于你需要组中 date2 最大的,所以要对 date2 先行排序,以使组中最大的总是排在前面
    因为表被排序了,cid 显然不是原来的次序了,所以才有最后的 order by cid你可以从该查询生成视图来提高检索的效率
    或者将 date2 另表保存如果 date2 上有索引的话,应该不会产生临时文件
    你可用 EXPLAIN 指令观察一下