关于Mysql中max()与group by联合使用时的取值问题

今天在微信群里看到一个码友问了一个关于group 和 max()一起使用的时,取出的数据并不是想要的数据。

于是自己建了个简单的表试了一下,还真是,话不多说,先上表(t_price)数据:

毕竟只是做测试用,这些数据足够了。

 

需求:取出按num分组,每组最大的一条数据;

 

1.先执行下面这个语句:

SELECT *,MAX(price) FROM t_price GROUP BY num

得到的是错误的数据:

可以看到最后一栏虽然得到的数据的确是每个num的所属组的最大值,但是对应的却不是正确的行数

查了下,做了下实验发现group by会先Max执行,所以得到的都是每个num对应的第一行数据,

那就会想到一个也经常用的order by 和group by 又是怎么样怎样的一个先后顺序?

如果Order by 先执行的话不是直接在后面直接加个order by就可以得到想要的结果了?

那么来试试:

运行:SELECT *,MAX(price) FROM t_price GROUP BY num ORDER BY price DESC

得到的是:

可以看到,结果是group by 先执行再执行order by ,所以也是没有办法得到想要的结果,

 

那想要的到想要的结果,写法:

<1>正确

SELECT * FROM t_price WHERE price in (select max(price) Max_price FROM t_price  GROUP BY num) GROUP BY num 
因为group by 不会位于where之前。(where先对表的数据进行筛选)

 

 

<2>要看mysql的版本

这个语句是我查资料的时候看到的,但是用在我的表里面就不适用,感觉奇怪

SELECT * FROM (SELECT * FROM t_price ORDER BY price DESC)t2 GROUP BY num

这个是我执行语句之后的结果,我机子上的Mysql是5.7版本的,用了一个mysql5.5的来实验,得到的是:

查了一下,mysql5.7之后对于这个顺序很像进行改变了,所以使用这个语句的时候要特别小心。

 

 

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值