用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > mysql教程

mysql中GROUP BY 和ORDER BY 组合使用注意事项

时间:2015-01-23  来源:西部数据  作者:西部数据

今天在做一个微信的在线客服系统的时候,东西需要从一个表中调最近的用户,但是这个表是一个消息记录表结构如下,例子:

  1. ID  uid  content  weid      addtime   
  2. 1  2  3213123  12  …..       
  3. 2  3  3213123  12  ….   
  4. 3  2  321312  12  …   
  5. 3  1  xxx  12  3232  

我们的需求是从消息表中掉出来最近的用户,刚开始的时候用的是这样写的,代码如下:

  1. SELECT f . *  
  2. FROM  `enet_wechat_message` AS m 
  3. LEFT JOIN  `enet_wechatfans` AS f ON m.fakeid = f.openid 
  4. AND m.weid =135 
  5. AND f.weid =135 
  6. WHERE f.fakeid IS NOT NULL  
  7. GROUP BY m.fakeid 
  8. ORDER BY m.id DESC  
  9. LIMIT 10 

但是这些写完之后发现不是我想要的结果,通过查资料发现MYSQL的执行顺序是如下代码:

from… where…group by… having…. select … order by…

这样我最后的ORDER BY 是在GROUP BUY 之后才进行的排序所以数据不是我想要的,采用如下方法可以解决,代码如下:

  1. SELECT *  
  2. FROM ( 
  3. SELECT *  
  4. FROM  `enet_wechat_message`  
  5. WHERE weid =135 
  6. ORDER BY  `id` DESC 
  7. ) `temp`  www.phpfensi.com 
  8. GROUP BY fakeid 
  9. ORDER BY  `id` DESC 

LIMIT 10使用子查询,先对结果集进行排序,然后在进行分组,这样就可以实现我需要最新的几个用户了,当然这个代码的业务逻辑还需要用户的个人信息,所以我最终的代码是如下的:

  1. SELECT f . *  
  2. FROM ( 
  3. SELECT *  
  4. FROM ( 
  5. SELECT *  
  6. FROM  `enet_wechat_message`  
  7. WHERE weid =135 
  8. ORDER BY  `id` DESC 
  9. ) `temp`  
  10. GROUP BY fakeid 
  11. ORDER BY  `id` DESC  
  12. LIMIT 10 www.phpfensi.com 
  13. AS m 
  14. LEFT JOIN  `enet_wechatfans` AS f ON m.fakeid = f.openid 
  15. WHERE f.fakeid IS NOT NULL  
  16. GROUP BY m.fakeid 
  17. ORDER BY m.id DESC
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
栏目更新
栏目热门