【Mysql】group by中的排序问题

/**
 * Author:RDP
 * My mail:abel1314520@gmail.com
 * My blog:  http://blog.teamhaka.com

 */


比如有这样的一个表结构:

id  v1  
10  1   
11  1   
20  1   
8    1   
7    1  

 

当你使用

SELECT COUNT(*),id FROM tbl GROUP BY v1

来进行搜索的时候,得到的结果只有一行。其id的值是10。

这里id的值之所以是10,和你SQL语句中的是否含有ASC、DESC无任何关系。只是因为在表的存储中,id为10的行排在了v1为1这个group中的最前面。

如果你希望上例的select结果集中的id是20的话,你也千万别指望用类似SELECT * FROM tbl GROUP BY  v1 ORDER BY id DESC 来实现。因为group by 会比 order by 先执行。

归根结底,Mysql的group by 并没有排序功能!你没有办法在group by的各个group中进行针对某一列的排序。

 

但是解决方法是有的,提示就是最前面的红字:“只是因为在表的存储中,id为10的行排在了v1为1这个group中的最前面。”。

所以只要在group by前将顺序调整好,把你希望的数据排在最前面,那么group by时就能顺利取到这个数据。

故解决方法就是先进行你想要的排序,然后在此排序后的结果集的基础上,进行group by 操作。

就上例而言,若希望取到以v1列来分group,各group中id最大的值的话,SQL语句如下:

SELECT count(*) , id
FROM
( SELECT * FROM tbl ORDER BY id DESC ) temp
GROUP BY v1

 

注意:SELECT * FROM xxx GROUP BY  xxx DESC 是语法错误!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值