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