分类

链接

2012 年 1 月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > MySQL, Oracle, SQL Server, SQLite > 正文
共享办公室出租
SQL中group by的用法
MySQL, Oracle, SQL Server, SQLite 暂无评论 阅读(3,197)

首先先贴两条sql,大家看看有啥区别

  1. select * from all_txt A where id=(SELECT id from all_txt    
  1. where A.key_value = key_value ORDER BY release_time DESC limit 1);  
  1. select * from (select *,max(release_time) as timea   
  1. 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最新的数据

所有的数据为

  1. id  key_value release_time  
  2. 1    001    2007-11-01  
  3. 2    001    2007-11-02  
  4. 3    001    2007-11-03  
  5. 4    002    2007-11-04  
  6. 5    002    2007-11-05  
  7. 6    003    2007-11-06  
  8. 7    004    2007-11-07  
  9. 8    004    2007-11-08  
  10. 9    005    2007-11-09  
  11. 10   005    2007-11-10  


现在要的结果为

  1. id  key_value release_time  
  2. 3    001    2007-11-03  
  3. 5    002    2007-11-05  
  4. 6    003    2007-11-06  
  5. 8    004    2007-11-08  
  6. 10   005    2007-11-10  


针对这些数据,显示貌似都一样
但仔细研究下来就会发现
第二句 返回的会是

  1. id  key_value timea     release_time  
  2. 3    001    2007-11-03  2007-11-01  
  3. 5    002    2007-11-05  2007-11-04  
  4. 6    003    2007-11-06  2007-11-06  
  5. 8    004    2007-11-08  2007-11-07  
  6. 10   005    2007-11-10  2007-11-09  

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

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:SQL中group by的用法 | Bruce's Blog

发表评论

留言无头像?