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.


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.


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: (o algo similar) 

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';

Este cambio no es permanente, y hay que hacerlo antes de lanzar nuestra SQL. 

Es importante hacerlo permanente se podría hacer incluyendo el comando en el fichero de configuración de MySQL llamado my.cnf.