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之前

发布了217 篇原创文章 · 获赞 70 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/103484230