今天在微信群里看到一个码友问了一个关于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之后对于这个顺序很像进行改变了,所以使用这个语句的时候要特别小心。