Grabar error mysqlsql_mode=only_full_group_by
1. Mensaje de error
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated
column 'xxx' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
在MySQL 5.7后,MySQL默认开启了SQL_MODE严格模式,对数据进行严格校验。如果代码中含有group by聚合操作,那么select中的列,要么是来自max()、min()、sum()、avg()等聚合函数的结果,要么其他字段都出现在group by中
2. Mensaje de error clave
1. SELECT list is not in GROUP BY clause and contains nonaggregated
( La lista SELECT no está en la cláusula groupby y contiene listas no agregadas )
2. sql_mode=only_full_group_by
( modo estricto )
3. Caso
Si se ejecuta el siguiente sql, aparecerá el mensaje de error descrito anteriormente
select name,age from student group by name
¿Como lidiar con? Puede consultar los siguientes métodos
Método 1: Agregar todos los campos seleccionados para agrupar por
select name,age from student group by name,age
Método 2: Todos los campos que no han sido agrupados por son funciones agregadas
select name,max(age) as age from student group by name
Método 3: Eliminar campos que no han sido agrupados por
select name from student group by name
Desventajas de los métodos anteriores
1. El sql ajustado debe garantizar la invariancia de los resultados de ejecución de sql antes y después del ajuste. Para algunas declaraciones de sql complejas, será más problemático ajustar
2. Agregar una función de agregación a un campo afectará la eficiencia de ejecución de SQL
3. Si hay muchas declaraciones SQL que deben ajustarse, llevará mucho tiempo
4. Es posible que el SQL ajustado no pueda obtener toda la información deseada
4. Resuelve
Método 1: modificar la configuración de msql directamente (el reinicio falla)
Abra la base de datos y ejecute el siguiente sql
SELECT @@GLOBAL.sql_mode;
Aparecerá la siguiente información, y los datos en diferentes bases de datos pueden ser diferentes
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Si la información que aparece contiene ONLY_FULL_GROUP_BY
, ONLY_FULL_GROUP_BY se eliminará y los demás permanecerán sin cambios
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';
Nota: Al usar el método anterior, la configuración se restaurará después de que se reinicie la base de datos y debe configurarse nuevamente.Método
2: Modifique el archivo de configuración msql (permanentemente válido)
Buscando el archivo de configuración my.cnf de mysql
Agregue la siguiente configuración en el módulo [mysqld] ( el valor de configuración no es fijo )
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Nota: sql_mode
instrucción = sql: la cadena después de que SELECT @@GLOBAL.sql_mode
se elimine el resultado de la consulta ONLY_FULL_GROUP_BY
Método 3: use la función any_value()
any_value() seleccionará el valor de columna especificado de la primera pieza de datos en los datos que se clasifican en el mismo grupo que los datos devueltos
La función any_value () puede suprimir el rechazo del valor ONLY_FULL_GROUP_BY
el caso
select name,any_value(age) as age from student group by name