mysql的1055以及group by和order by

拼搏现实的明天。 2023-07-01 05:24 60阅读 0赞

举个常见的业务例子:求每组数据并每组数据按倒序排

建表语句略

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

总结:百度大多对于1055错误的解决方式都是关闭ONLY_FULL_GROUP_BY (很多别人写的csdn等,所以对于百度的结果需要自己验证自己判断别人说的是否正确才是作为一个研发人员应该考虑的事情,而不是一味的copy),因为5.7版本前没有这个5.7之后有就报错对于关闭这个规则限制检查只是限制了其检查而已并没有解决本质上的问题,关闭后sql可以查询查出的结果看上去好像是对的但是实际上是不对的,所以关闭它没有意义,本质上其实就应该改变sql的实现方式

发表评论

表情:
评论列表 (有 0 条评论,60人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql group by order by

    这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况 这种需求,我想很多人都遇到过。下面是我模拟我的内容表 复制代码 代码如下: