zoukankan      html  css  js  c++  java
  • SQL group by的困惑

    今天为写一条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_time
    1    001    2007-11-01
    2    001    2007-11-02
    3    001    2007-11-03
    4    002    2007-11-04
    5    002    2007-11-05
    6    003    2007-11-06
    7    004    2007-11-07
    8    004    2007-11-08
    9    005    2007-11-09
    10   005    2007-11-10

    现在要的结果为
    id  key_value release_time
    3    001    2007-11-03
    5    002    2007-11-05
    6    003    2007-11-06
    8    004    2007-11-08
    10   005    2007-11-10

    针对这些数据,显示貌似都一样
    但仔细研究下来就会发现
    第二句 返回的会是
    id  key_value timea     release_time
    3    001    2007-11-03  2007-11-01
    5    002    2007-11-05  2007-11-04
    6    003    2007-11-06  2007-11-06
    8    004    2007-11-08  2007-11-07
    10   005    2007-11-10  2007-11-09

    用max求出来的数据timea是没错,是上面的release_time,但真实的release_time却是不一样的,那证明取的数据不是最新的那条的,而是给我感觉取的是物理位置上的第一条,这样的话如果你还需要这张表的其他字段就会有问题。
    说了半天有人会说,那你就用第一种吧,执行下你就会发现,性能太差了,而第二种就很快,本以为能用第二种的,哎~~~~可能是对group by的本质还是了解不是很透彻
    大家有啥更好的优化意见或方法,可以给我留言或加入qq群:47833489 讨论


  • 相关阅读:
    ThinPHP v5.x安装初始化配置(项目实战)
    Bresenham快速画直线算法
    arm笔记之MOV
    Blackfin DSP的C语言优化之Circular Buffer
    Visual DSP定点数(fract)使用指南
    全局二值化
    Blackfin DSP学习心得与参考资料
    Linux网络配置
    一般方程与参数方程求直线交点
    一个改进的快速排序实现
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152548.html
Copyright © 2011-2022 走看看