MySql5.7以上使用Group By報錯

1.報錯的信息

 SQL語句:

 這是一個根據Code分組再根據order排序再取排序後的第一條數據的sql語句

       SELECT 
			m.*
			 FROM (
        SELECT
        nms.ID,
        nms.NOTIFY_TYPE,
        nms.`CODE`,
        nms.PROJECT_ID,
        nms.PM_ENABLE,
        nms.EMAIL_ENABLE,
        nssc.`NAME` AS CATEGORY,
        nssc.ID AS CATEGORY_ID,
        nms.OBJECT_VERSION_NUMBER,
        ntu.TYPE,
        ntu.USER_ID,
        ntu.MESSAGE_SETTING_ID,
        ntu.ID AS U_ID,
        nss.`NAME`,
        ntu.OBJECT_VERSION_NUMBER AS U_OBJECT_VERSION_NUMBER
        FROM notify_message_setting nms , notify_target_user ntu
        , notify_send_setting nss
        , notify_send_setting_category nssc
        WHERE nms.ID=ntu.MESSAGE_SETTING_ID
        and nms.`CODE`=nss.`CODE`
        and nss.CATEGORY_CODE=nssc.`CODE`
        and nms.NOTIFY_TYPE='devops'
--         <if test="messageSettingDTO.name !=null and messageSettingDTO.name !=''">
--             and nss.name like "%"#{messageSettingDTO.name}"%"
--         </if>
            and nms.PROJECT_ID is NULL
--         <if test="projectId !=null and projectId !=null">
--             and nms.PROJECT_ID =#{projectId} or nms.PROJECT_ID is NULL
--         </if>
        ORDER BY nms.ID DESC LIMIT 1000
        ) m
        GROUP BY m.`CODE`

先查看Mysql的版本

查看sql_mode

可以設置一下不要only_full_group_by

set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

百度了一下原因:

 mysql5.7.x版本,默認是開啓了 only_full_group_by 模式的,但開啓這個模式後,原先的 group by 語句就報錯,關閉這個模式是不可取的。MySQL 5.7.5和up實現了對功能依賴的檢測。如果啓用了only_full_group_by SQL模式(在默認情況下是這樣),那麼MySQL就會拒絕選擇列表、條件或順序列表引用的查詢,這些查詢將引用組中未命名的非聚合列,而不是在功能上依賴於它們。

 MySQL也提供了any_value()函數來抑制ONLY_FULL_GROUP_BY值被拒絕

QL也提供了any_value()函數來抑制ONLY_FULL_GROUP_BY值被拒絕

所以sql改成:

       SELECT 
			 any_value(m.ID) AS ID,
			 any_value(m.NOTIFY_TYPE) AS NOTIFY_TYPE,
			 m.`CODE`,
			 any_value(m.PROJECT_ID) AS PROJECT_ID,
			 any_value(m.PM_ENABLE) AS PM_ENABLE,
			 any_value(m.EMAIL_ENABLE) AS EMAIL_ENABLE,
			 any_value(m.CATEGORY) AS CATEGORY,
			 any_value(m.CATEGORY_ID) AS CATEGORY_ID,
			 any_value(m.OBJECT_VERSION_NUMBER) AS OBJECT_VERSION_NUMBER,
			 any_value(m.TYPE) AS TYPE,
			 any_value(m.USER_ID) AS USER_ID,
			 any_value(m.MESSAGE_SETTING_ID) AS MESSAGE_SETTING_ID ,
			 any_value(m.U_ID) AS U_ID,
			 any_value(m.`NAME`) AS NAME,
			 any_value( m.U_OBJECT_VERSION_NUMBER) AS U_OBJECT_VERSION_NUMBER 

			 FROM (
        SELECT
        nms.ID,
        nms.NOTIFY_TYPE,
        nms.`CODE`,
        nms.PROJECT_ID,
        nms.PM_ENABLE,
        nms.EMAIL_ENABLE,
        nssc.`NAME` AS CATEGORY,
        nssc.ID AS CATEGORY_ID,
        nms.OBJECT_VERSION_NUMBER,
        ntu.TYPE,
        ntu.USER_ID,
        ntu.MESSAGE_SETTING_ID,
        ntu.ID AS U_ID,
        nss.`NAME`,
        ntu.OBJECT_VERSION_NUMBER AS U_OBJECT_VERSION_NUMBER
        FROM notify_message_setting nms , notify_target_user ntu
        , notify_send_setting nss
        , notify_send_setting_category nssc
        WHERE nms.ID=ntu.MESSAGE_SETTING_ID
        and nms.`CODE`=nss.`CODE`
        and nss.CATEGORY_CODE=nssc.`CODE`
        and nms.NOTIFY_TYPE='devops'
--         <if test="messageSettingDTO.name !=null and messageSettingDTO.name !=''">
--             and nss.name like "%"#{messageSettingDTO.name}"%"
--         </if>
            and nms.PROJECT_ID is NULL
--         <if test="projectId !=null and projectId !=null">
--             and nms.PROJECT_ID =#{projectId} or nms.PROJECT_ID is NULL
--         </if>
        ORDER BY nms.ID DESC LIMIT 1000
        ) m
        GROUP BY m.`CODE`

之後就可以成功查出數據。

group by 還可以用來去除數據重複,放在order by之前

 

 

 

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