Cómo resolver un error de sintaxis de MySQL o una infracción de acceso: la expresión 1055 de la lista SELECT no está en la cláusula GROUP BY y contiene una columna no agregada que no depende funcionalmente de las columnas de la cláusula GROUP BY

Hace un par de semanas, trabajando en un proyecto heredado que necesitaba actualizarse y trasladarse a un nuevo servidor, obtuve la siguiente excepción en un par de módulos de la aplicación:

Expression of SELECT list is not in GROUP BY clause and contains nonaggregated column this is incompatible with sql_mode=only_full_group_by.

De acuerdo con la documentación de MySQL, tener el único grupo completo por modo en el modo sql rechazará las consultas para las cuales la lista de selección, la condición HAVING o la lista ORDER BY se refieren a columnas no agregadas que no están nombradas en la cláusula GROUP BY ni son funcionalmente dependientes en (determinado únicamente por) columnas GROUP BY.

En algunos casos, como la consulta estándar no funcionará con una configuración predeterminada en el cliente mysql, puede ser una buena práctica reescribirla de manera que la excepción ya no aparezca, sin embargo, debido al tiempo y los costos de desarrollo, necesitará una solución más rápida y no tan cara. El punto de esta solución es que la consulta funcionó en una versión anterior de MySQL con diferentes configuraciones, por lo que puede ejecutar las mismas consultas simplemente cambiando el modo sql de su cliente MySQL y le mostraremos cómo hacerlo en este breve artículo.

1. Busque el archivo MySQL my.cnf

Lo primero que debe hacer es encontrar el archivo de configuración de MySQL. Por ejemplo, con muchas distribuciones como Plesk, puede encontrar el archivo en /etc/mysql/my.cnf o en /etc/my.cfn, sin embargo, esto puede variar, por lo que podrá encontrarlo usando un comando de linux como:

find / -name my.cnf

Esto generará la ruta a los archivos con ese nombre. Una vez que encuentre el archivo, podrá cambiar la configuración que evitará que aparezca la excepción.

2. Modificar el modo sql

Dentro del bloque de configuración [mysqld] , debes actualizar el valor de la sql_modepropiedad a una cadena vacía que eliminará el 'only_full_group_by' modo:

# Inside the mysqld block
[mysqld]
# add new option
sql_mode = ""

Editar el archivo my.cnf usando nano, vi, emacs o vía SFTP y guarde los cambios. Por ejemplo, el archivo my.cnf terminaría así con nuestra nueva configuración:

#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
bind-address = ::ffff:127.0.0.1
local-infile=0

# Important: remove limitation of group by with the following line
sql_mode = ""

Guarda los cambios en el archivo y reinicie mysql con el cli según su sistema operativo y el proceso de instalación, por ejemplo:

# Ubuntu
sudo service mysql restart

# CentOS
/etc/init.d/mysqld start

Ahora, las consultas con el problema deberían poder ejecutarse ahora y la excepción ya no aparecerá.

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable