咱们以ecshop中的goods表来讲明mysql
① 好比咱们执行这么一条sql:sql
select cat_id,max(shop_price) from goods group by cat_id order by shop_price desc;
这个结果也许有点诡异,怎么没有按shop_price降序排列呢?
查询出来的结果中max(shop_price)虽然和表上的数据是同样的,但它并不表明某个具体商品的价格,好比栏目5下有3个3700元的商品,那么栏目5下这个最贵商品价格3700元是哪一个商品的价格呢?
因此 max(shop_price) 列的值就是表明每一个栏目下最贵的商品,和表中每一个商品的价格没有一一对应的关系,而order by shop_price desc是按表中商品的价格降序排列的,因此在上面的查询结果集中并看不出排序的效果(看不出排序的效果,不是说排序没有效果)spa
咱们再看看商品表按价格降序排列是什么效果:code
select cat_id,goods_id,goods_name,shop_price from goods order by shop_price desc;
这个cat_id排序的结果(3.5.4.2)和上面那个cat_id排序的结果(5.4.2.3)彷佛也不同啊?
咱们来看看这条sql排序
select cat_id,max(shop_price),shop_price from goods group by cat_id;
group by cat_id的时候,对于其它列,mysql默认取它第一次遇见的行,因此shop_price列的值是这些数据
并且sql语句的执行顺序是:
from --> join --> on --> where --> group by --> having --> select --> order by -->limit
因此咱们也不能拿select cat_id from goods order by shop_price desc;的结果来评判select cat_id,max(shop_price) from goods group by cat_id order by shop_price desc;的排序结果
MySQL在执行完select cat_id,max(shop_price),shop_price from goods group by cat_id以后执行order by shop_price desc,即以下sql:
select cat_id,max(shop_price),shop_price from goods group by cat_id order by shop_price desc;ip
② 若是咱们按goods_id分组,shop_price降序排列,不会出现所谓诡异的状况,由于此时分组的列(goods_id)和shop_price是一一对应的
select goods_id,goods_name,shop_price from goods group by goods_id order by shop_price desc;it
若是group by以后还要使用order by,那么order by的字段最好是select返回的字段,避免所谓诡异的状况(固然事实上并不诡异)class