Error de consulta de Mysql: sql_mode=only_full_group_by solución y caso

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_modeinstrucción = sql: la cadena después de que SELECT @@GLOBAL.sql_modese 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

おすすめ

転載: blog.csdn.net/weixin_52116015/article/details/131632286