4

我们以ecshop中的goods表来说明

① 比如我们执行这么一条sql:

select cat_id,max(shop_price) from goods group by cat_id order by shop_price desc;

clipboard.png
这个结果也许有点诡异,怎么没有按shop_price降序排列呢?
查询出来的结果中max(shop_price)虽然和表上的数据是一样的,但它并不代表某个具体商品的价格,比如栏目5下有3个3700元的商品,那么栏目5下这个最贵商品价格3700元是哪个商品的价格呢?
所以 max(shop_price) 列的值就是代表每个栏目下最贵的商品,和表中每个商品的价格没有一一对应的关系,而order by shop_price desc是按表中商品的价格降序排列的,所以在上面的查询结果集中并看不出排序的效果(看不出排序的效果,不是说排序没有效果)

我们再看看商品表按价格降序排列是什么效果:

select cat_id,goods_id,goods_name,shop_price from goods order by shop_price desc;

clipboard.png

这个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;

clipboard.png
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;

clipboard.png
② 如果我们按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;

如果group by之后还要使用order by,那么order by的字段最好是select返回的字段,避免所谓诡异的情况(当然事实上并不诡异)


web360
838 声望28 粉丝

大家都是凡人,难道你确定你是大神?