mysql的1055以及group by和order by
举个常见的业务例子:求每组数据并每组数据按倒序排
建表语句略
1)有人想用下面的这条语句取巧的方式得到 按性别分组中每组中年龄最大的那一条数据
select * from ( select * from persion order by age desc) group by sex;
实际上并不能得到想要的结果,在mysql5.7以前版本sql_mode中还没有 **ONLY_FULL_GROUP_BY 规则限制,所以上述语句可执行,但是结果是不对的,先排序再分组,分组每组里取的值并不是确定的所以 得不到每组最大的一条数据,解决方法通过和max函数结合分组找最大的子查询是可以实现的,mysql5.7及以后sql_mode中加了ONLY_FULL_GROUP_BY所以上面的那条sql语句直接就报错不能执行。本质上也应该不能直接原因是它都只能得到错误结果了为什么还要执行呢**
2)问题,求按性别分组并每组中的数据从大到小排列。别被这里的分组给忽悠了 分组是不能实现的其是用order by排序就可以搞定。如下
select * from persion order by sex asc,age desc;
+——+————+——-+——-+
| id | name | age | sex |
+——+————+——-+——-+
| 5 | 沈焕碧 | 29 | 女 |
| 2 | 虞培先 | 26 | 女 |
| 1 | 石之婷 | 25 | 女 |
| 8 | 许秋胜 | 22 | 女 |
| 10 | 张青之 | 22 | 女 |
| 3 | 袁百进 | 20 | 女 |
| 7 | 葛虹桐 | 26 | 男 |
| 6 | 唐峰先 | 25 | 男 |
| 4 | 齐彪万 | 20 | 男 |
| 9 | 雷绍风 | 20 | 男 |
+——+————+——-+——-+
2)问题,求按性别分组并每组中的数据从大到小排列取每组前2条数据。如下这样才能得到正确结果
select p1.id,p1.name,p1.age,p1.sex from persion p1 where( select count(1) from persion p2 where p1.sex=p2.sex and p1.age<=p2.age )<=2 order by age desc;
+——+————+——-+——-+
| id | name | age | sex |
+——+————+——-+——-+
| 5 | 沈焕碧 | 29 | 女 |
| 2 | 虞培先 | 26 | 女 |
| 7 | 葛虹桐 | 26 | 男 |
| 6 | 唐峰先 | 25 | 男 |
+——+————+——-+——-+
官网bug对1055的解释
https://bugs.mysql.com/bug.php?id=80131
还没有评论,来说两句吧...