mysql group by 顺序_mysql group by 排序的问题

最近在项目中遇到了一个需要先排序,再group by的问题。

上表

CREATE TABLE `test` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`install` int(10) unsigned NOT NULL,

`day` int(10) unsigned NOT NULL,

`aid` int(10) unsigned NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

/*Data for the table `test` */

insert  into `test`(`id`,`install`,`day`,`aid`) values (1,1232,20080808,1),(2,2321,20080809,2),(3,1236,20080810,3),(5,4212,20080809,1),(6,2312,20080810,1),(7,1432,20080811,1),(8,2421,20080808,2),(9,4245,20080811,2),(10,5654,20080810,2),(11,412,20080808,3);

发现网上大部分的方法是这样的

SELECT * FROM (SELECT * FROM test  ORDER BY DAY DESC)  ssss GROUP BY  aid ORDER BY DAY DESC

该方法在mysql5.6.17上测了没有问题,但是在新版本的mysql上测就不对,我现有的版本是10.0.13-mariaDB测了不对, 对应的版本的mysql测了也有问题。

正确的结果

wDxiTlfxOByEQAAAABJRU5ErkJggg==

错误的结果

QxXYHwtt5xYk82lymRCJsnPKkOdK1EZKP+GhMxGyKdWS45wpPqQNfmzobRGmPMhkhnlkuO8KQ60LW5s2G0xhizIdKZ5ZIjPKkOdG3ubBitMcZsiHRmueQIT6oDXZs7G0ZrjDEbIp1ZLjnCk+pA1+bOhtEaY8yGSGeWS2sLYsBojTFmQ6Qzy0WtEbasebehwTwYwqMMbWhokEITXkODAprwGhoU0ITX0KCAJryGBgU04TU0KKAJr6FBAU14DQ0KaMJraFBAE15DgwL+B1UKmrNPfIRrAAAAAElFTkSuQmCC

比较了一下发现子查询中的ORDER BY DAY DESC根本没生效。

explain一下sql语句发现mysql5.6.17下打印了2条记录

A98co7g9e43jAAAAAElFTkSuQmCC

但是在10.0.13-mariaDB下面只打印了后面一条记录,怀疑是不是新版的mysql对这种子查询进行了优化。

既然mysql不支持只能换方法了

第一种方法(网上了)

SELECT A.* FROM test A,

(SELECT aid, MAX(DAY) max_day FROM test GROUP BY aid) B

WHERE A.aid = B.aid AND A.day = B.max_day

ORDER BY a.day DESC

第二种方法

SELECT * FROM `test` WHERE id IN(

SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY `day` DESC),',',1) FROM `test` GROUP BY aid )

ORDER BY `day` DESC

总结:上面的表的数据是从网上复制的,对于开头写的那种查询方法不行的原因,具体的我还不清楚,只是猜测。所以遇到问题基本用的后面的方法。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值