mysql的1055以及group by和order by

                 舉個常見的業務例子:求每組數據並每組數據按倒序排

建表語句略

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

總結:百度大多對於1055錯誤的解決方式都是關閉ONLY_FULL_GROUP_BY (很多別人寫的csdn等,所以對於百度的結果需要自己驗證自己判斷別人說的是否正確纔是作爲一個研發人員應該考慮的事情,而不是一味的copy),因爲5.7版本前沒有這個5.7之後有就報錯對於關閉這個規則限制檢查只是限制了其檢查而已並沒有解決本質上的問題,關閉後sql可以查詢查出的結果看上去好像是對的但是實際上是不對的,所以關閉它沒有意義,本質上其實就應該改變sql的實現方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章