舉個常見的業務例子:求每組數據並每組數據按倒序排
建表語句略
1)有人想用下面的這條語句取巧的方式得到 按性別分組中每組中年齡最大的那一條數據
select * from (
select * from persion order by age desc)
group by sex;
實際上並不能得到想要的結果,在mysql5.7以前版本sql_mode中還沒有 ONLY_FULL_GROUP_BY 規則限制,所以上述語句可執行,但是結果是不對的,先排序再分組,分組每組裏取的值並不是確定的所以 得不到每組最大的一條數據,解決方法通過和max函數結合分組找最大的子查詢是可以實現的,mysql5.7及以後sql_mode中加了ONLY_FULL_GROUP_BY所以上面的那條sql語句直接就報錯不能執行。本質上也應該不能直接原因是它都只能得到錯誤結果了爲什麼還要執行呢
2)問題,求按性別分組並每組中的數據從大到小排列。別被這裏的分組給忽悠了 分組是不能實現的其是用order by排序就可以搞定。如下
select * from persion order by sex asc,age desc;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 5 | 沈煥碧 | 29 | 女 |
| 2 | 虞培先 | 26 | 女 |
| 1 | 石之婷 | 25 | 女 |
| 8 | 許秋勝 | 22 | 女 |
| 10 | 張青之 | 22 | 女 |
| 3 | 袁百進 | 20 | 女 |
| 7 | 葛虹桐 | 26 | 男 |
| 6 | 唐峯先 | 25 | 男 |
| 4 | 齊彪萬 | 20 | 男 |
| 9 | 雷紹風 | 20 | 男 |
+----+--------+-----+-----+
2)問題,求按性別分組並每組中的數據從大到小排列取每組前2條數據。如下這樣才能得到正確結果
select p1.id,p1.name,p1.age,p1.sex from persion p1 where(
select count(1) from persion p2 where p1.sex=p2.sex and p1.age<=p2.age
)<=2 order by age desc;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 5 | 沈煥碧 | 29 | 女 |
| 2 | 虞培先 | 26 | 女 |
| 7 | 葛虹桐 | 26 | 男 |
| 6 | 唐峯先 | 25 | 男 |
+----+--------+-----+-----+
官網bug對1055的解釋
https://bugs.mysql.com/bug.php?id=80131