mysql的1055以及group by和order by

10 篇文章 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值