En MySQL podemos obtener el error con código 1055 en aquellas ocasiones que construimos una consulta de base datos cuando una expresión SQL con group by no devuelve las mismas columnas que en la expresión de agrupación que hemos construido.
Error Code: 1055. Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column
Expresado de otra manera, este error se produce cuando se lanza una SQL con Group By donde las columnas de agrupación no coinciden con las que se quiere agrupar.
También le puede interesar
Guía rápida de administración de MySQL
Guía para montar un servidor web en una Raspberry Pi
Guía para crear un diagrama entidad relación de una base de datos existente MySQL
Descripción del error code 1055 de MySQL
Cómo comentaba al principio el error es el siguiente:
Error Code: 1055. Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'BBDD.tabla.columna' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Este error se produce cuando estamos intentando lanzar una SQL donde se devuelve una columna que no es agrupada dentro de la claúsula Group By, mostrando la incompatibilidad en cuestión.
En mi caso, este error me sucedió con la versión de MySQL 8.0.15 y la solución fue sencilla.
Solución al error code 1055 only_full_group_by
Esta solución ha sido probada con la versión MySQL 8.0.15. En cualquier otra versión no puedo garantizar que funcione, aunque creo que puede ser una solución bastante genérica a partir de esta versión ya que en antiguas no me ha sucedido.
La solución consiste en modificar una variable de entorno de MySQL. Por lo que previamente realizaremos un backup de esta.
Desde consola de comandos, lanzar la siguiente SQL:
SELECT @@sql_mode
Resultado:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Este resultado lo guardamos por si nos hiciera falta restaurarlo en otro momento.
Ahora vamos a actualizar la variable de entorno de MySQL eliminando el valor 'ONLY_FULL_GROUP_BY' que es el que nos está generando el problema al lanzar nuestra SQL. Para ello ejecutamos el siguiente comando:
SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Otra solución pero que a mi no me funcionó a priori pero que debería de funcionar, sería:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
De esta forma no tendríamos que hacer un backup previo del valor de la variable de entorno. Pero si no os funciona, como me ocurrió a mí, lo hacéis como expliqué antes.
También puede ocurrir que este cambio no sea permanente, y haya que hacerlo antes de lanzar nuestra SQL. Si queremos que sea permanente se podría hacer incluyendo el comando en el fichero de configuración de MySQL llamado my.cnf. Pero esa configuración se escapa de este tutorial y no la voy a tratar aquí.
Probé ambas posibles soluciones en MySQL 5.7.29 y no funcionaron, de todos modos se agradece el contenido, tal vez a otro le sirva.
Yo las pruebas que hice, como comentaba en el tutorial eran sobre la versión 8 de MySQL. Puede que en versiones antiguas no vaya como comentas. Si el día de mañana actualizas y te encuentras con este problema, puede que sí te sirva. Un saludo y gracias por pasarte
A mi SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); si que funcionó con MySql 5.7.29 en Windows Server 2019 pero tienes que reiniciar el servicio de MySql.
Gracias por tu aportación. Un saludo
me funciono SET sql_mode=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’; en mysql 5.7.30 la otra no jalo
Hola,
A mi me funciona en Linux
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
El problema es que si se reinicia o se para, al ponerlo en marcha de nuevo me da error, tengo que hacerlo de nuevo cada vez. No se como hacer para que quede permanente.
Creo que se soluciona si defines la variable en el fichero my.cnf de configuración del MySQL.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); esta funciona a partir de mysql 5.8.0
La primera solución no me dio resultado pero: SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));, Genial Muchas Gracias
Funcionó. Muchas gracias!!!!!!!!!!!!!!