MySQL 排序分組獲取最新一條記錄

需求

獲取 MySQL 表中修改最新的一條記錄,在沒有修改時間的時候獲取添加時間最新的一條記錄,將需求簡化後如下圖:
在這裏插入圖片描述
通過SQL得到紅框的id爲3、4的記錄!

實踐過程

SELECT t.* FROM (
    SELECT * FROM t_user ORDER BY create_time DESC, modify_time DESC
) AS t
GROUP BY t.username;

MySQL 版本爲 5.6.16 下,執行正常,可以得到紅框結果。
但是在 5.7.248.0.15 均報錯:

1 queries executed, 0 success, 1 errors, 0 warnings

查詢:select t.* from ( select * from t_user order by create_time desc ,modify_time DESC ) as t group by t.username LIMIT 0, 1000

錯誤代碼: 1055
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 't.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

執行耗時   : 0 sec
傳送時間   : 0 sec
總耗時     : 0 sec

提示是sql_mode的緣故;
錯誤原因:在MySQL5.7之後,sql_mode中默認存在ONLY_FULL_GROUP_BY,SQL語句未通過ONLY_FULL_GROUP_BY語義檢查所以報錯-------引用自MySQL-[Err] 1055 - Expression #1
ONLY_FULL_GROUP_BY:ONLY_FULL_GROUP_BY要求select語句中查詢出來的列必須是明確的(其他語句也是一樣)。

解決方案

1、查詢 sql_mode;

SELECT @@sql_mode;

2、複製查詢的結果,刪除ONLY_FULL_GROUP_BY後,重新賦值:

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

在這裏插入圖片描述
3、查詢
在這裏插入圖片描述
按照原語句查詢,雖然不報錯,但是得到的是 id爲1,4,並不是我們想要的

4、改造

添加 LIMIT 10000

SELECT t.* FROM (
    SELECT * FROM t_user ORDER BY create_time DESC ,modify_time DESC 
    LIMIT 10000
) AS t
GROUP BY t.username;

在這裏插入圖片描述
limit 的非官方解釋:
子查詢的排序被mysql優化掉了,因爲外部查詢需要分組,mysql認爲子查詢排序是沒有意義的,但是加了limit子查詢排序就有意義----引自mysql 先排序分組 取組裏面最新一條數據

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