报错
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'devzfcmsx2local.zf_post.ctime' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
直接运行下面的sql即可
遇到这个错误是因为MySQL的sql_mode
中包括了ONLY_FULL_GROUP_BY
,这个模式要求,在使用GROUP BY
语句时,SELECT
的列、HAVING
条件和ORDER BY
中的列,都必须是GROUP BY
中的列,或者是这些列的聚合函数。当你的ORDER BY
子句中包含了不在GROUP BY
中声明的列,而且没有使用聚合函数时,就会触发这个错误。
这里的错误信息指出,ORDER BY
子句中使用了zf_post.ctime
列,但这个列既不在GROUP BY
中,也没有用聚合函数处理,与ONLY_FULL_GROUP_BY
模式不兼容。
解决这个问题有几种方法:
GROUP BY
子句中添加zf_post.ctime
列。ORDER BY
中使用聚合函数处理zf_post.ctime
列,比如MAX(zf_post.ctime)
或MIN(zf_post.ctime)
。如果你控制了数据库的配置,可以考虑禁用ONLY_FULL_GROUP_BY
。
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
my.cnf
或my.ini
)。[mysqld]
部分,找到sql_mode
,去掉其中的ONLY_FULL_GROUP_BY
。也可以通过调整MySQL的全局sql_mode
来避免这个错误,但这会影响到所有的数据库和表,可能会引起其他问题。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
注意:在全局范围内修改sql_mode
可能会对数据库中的其他应用或查询产生意外的副作用,因此在使用这种方法前应仔细评估。
根据你的具体情况选择最合适的解决方案。如果你不确定如何操作,或者如果这是一个生产环境中的问题,建议先在一个测试环境中尝试,以避免数据丢失或服务中断。