mysql中group by以後order by並不老是有效的?

咱們以ecshop中的goods表來講明mysql

① 好比咱們執行這麼一條sql: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是按表中商品的價格降序排列的,因此在上面的查詢結果集中並看不出排序的效果(看不出排序的效果,不是說排序沒有效果)spa

咱們再看看商品表按價格降序排列是什麼效果:code

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;ip

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;it

若是group by以後還要使用order by,那麼order by的字段最好是select返回的字段,避免所謂詭異的狀況(固然事實上並不詭異)class

相關文章
相關標籤/搜索