问题
今天正在准备对沉淀表进行处理,因为有个sql的处理时间很长,但是这个sql的维度是月,也就是一个月处理一次,因此就先使用定时任务将其沉淀,查询的时候直接查询结果集就行了。
SELECT code1.code_value_name as 'tradeSourceName',
code1.code_value_id as 'tradeSource',
code10.code_value_name AS 'serviceName',
c.service_type as 'serviceCode',
count(*) AS 'collectNum',
(SUM((CASE WHEN b.status_code in ('userCancel','end','handOrderEnd')
then 1 else 0 END))) AS 'endNum',
(SUM((CASE WHEN b.status_code in ('end','handOrderEnd')
then 1 else 0 END))) AS 'finishNum'
FROM
xxxx
WHERE
xxxx=xxxx
GROUP BY c.service_type ,d.trade_inmode
这个查询没有sql语法上的错误,但是mysql的客户端竟然报错了:
Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘×××’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by;
卧槽,这是啥 ,因为我这个sql直接从别人的手里直接拷贝过来的,别人是可以使用的,不管它直接百度查询,定位到: sql_mode=only_full_group_by; 原来是sql_mode限制住我的sql规范性,MySql在低版本(5.7.x以下)中允许select后面的非聚合列不出现在group by中。以下sql在低版本中是可以运行的,但是在5.7及以上版本会报错。
解决
- show variables like '%sql_mode%'
2. 可以看到这个value里面有ONLY_FULL_GROUP_BY
那么久删除这个:下面这个sql是对session和global进行处理,session对会话影响,global对全局影响(需要重启),这样就消除了ONLY_FULL_GROUP_BY的规范影响。
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'