1. 程式人生 > >關於max()/min()和group by 的坑

關於max()/min()和group by 的坑

一張student表,和一張test表,如下圖所示
如果要查詢兩次考試總分最高的同學那次的考試成績,可能大家第一反映就是max()和group by:sql語句:SELECT s.name,t.test,t.math,t.chinese,t.english,max(t.total) from student s LEFT JOIN test t on s.id=t.student_id GROUP BY t.test結果正確,我差點都相信這條SQL對了!!!在試一下查詢數學成績最高的。sql語句:SELECT s.name,t.test,max(t.math),t.chinese,t.english,t.total from student s LEFT JOIN test t on s.id=t.student_id GROUP BY t.test

結果是不是很驚奇,很意外!那麼什麼原因導致的呢?首先max()和min()都隻影響()中的這個欄位,因此無論是查英語還是數學的最大值,它都是對的,但它不會影響整行資料,所以你會發覺第二次的數學成績根本就不是A的。那麼第一次為什麼對呢?也就是第二次為什麼還是A的成績呢(除了數學)?這就跟group by 有關!group by預設返回每一組的第一條資料(每一組的資料排序都是按預設順序排序的),所以第一次查詢結果正確完全是巧合!(SQL錯了哈)那麼既然group by預設返回每一組的第一條資料,我們是不是可以先排序再group by呢?比如查數學最高的:SQL語句:SELECT s.name,t.test,t.math,t.chinese,t.english,t.total from student s LEFT JOIN test t on s.id=t.student_id ORDER BY t.math DESC GROUP BY t.test

直接報錯,排序語法錯誤!原來排序根本就不能放在group by前面!不信的話可以移到後面,結果如下:雖然沒報語法錯誤,但結果只是呵呵噠。。。
對於這種,子查詢可以解決SQL語句:SELECT a.name,a.test,a.math,a.chinese,a.english,a.total from (SELECT s.name,t.test,t.math as math,t.chinese,t.english,t.total   from student s LEFT JOIN test t on s.id=t.student_id   ORDER BY t.math DESC) as a GROUP BY a.test