日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql的distinct、order by和group by冲突报错

發布時間:2024/3/26 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql的distinct、order by和group by冲突报错 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目場景:

需求:前端下拉框(字段A)數據需要根據時間字段(字段B)倒序排序且去重返回(結果集是List<String>)

思路:1、distinct+order by;2、group by+order by;3、order by+java的set集合;4、先order by排序后distinct去重;


問題描述和分析

踩坑經歷:由于我本地數據庫的版本是5.7.35-log,項目發布線上數據庫版本是5.7.39,思路1和思路2在5.7.35-log版本都可運行,但是發布到5.7.39上就會報錯(思路1報錯:...which is not in SELECT list; this is incompatible with DISTINCT,思路2報錯:...which is not functionally dependent on columns in GROUP BY clause;)。

分析原因是:5.7.39版本的Mysql語法更加嚴格了,Distinct關鍵字也帶排序且優先級大于order by,且order by和group by后的字段在select中必須存在。

Mapper.java中顯示:

@Repository public interface ProcessExaminerMapper {List<String> getAllBatchByJudge(); }

Mapper.xml中顯示:?

#思路1、distinct+order by <select id="getAllBatchByJudge" resultType="java.lang.String">SELECT DISTINCTbatch FROMst_process_examiner ORDER BYcreate_time DESC </select>#思路2、group by+order by <select id="getAllBatchByJudge" resultType="java.lang.String">SELECTbatch FROMst_process_examiner GROUP BYbatch ORDER BYcreate_time DESC </select>


解決方案:

?解決方法:推薦思路4:先order by排序后distinct去重(一句sql解決,且速率快),
思路3可以用但不推薦,這里就不寫了,詳細思路:就是雙層for循環,外層循環是order by的有順序的list,內層循環是set集合,循環體操作:if判斷匹配元素,匹配到則插入一個新的list(返回的結果集合)并且set.remove("匹配的元素"),這樣做是為了減少內部循環次數

?Mapper.xml中顯示:

#思路4、先order by排序后distinct去重<select id="getAllBatchByJudge" resultType="java.lang.String">SELECT DISTINCTbatch FROM( SELECT DISTINCT batch, create_time FROM st_process_examinerORDER BY create_time DESC ) a </select>

結束語:我們一生中可能只能決定5%的事情,決定不了出生、智商和貴人相助,但是沒有誰的劇本值得羨慕,只能把自己的劇本演好。

總結

以上是生活随笔為你收集整理的Mysql的distinct、order by和group by冲突报错的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。