Error de group en mysql, apagar ONLY_FULL_GROUP_BY

02 de Ene, 2019

Error de group en mysql, apagar ONLY_FULL_GROUP_BY
5 (100%) 2 votes

Si te encuentras con este error en Mysql

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated
column ‘db.table.col’ which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by

ONLY_FULL_GROUP_BY

Es la mayoría de las veces porque tienes la función de ONLY_FULL_GROUP_BY habilitada. Para arreglarlo, debes desabilitarlo.

Primer paso vamos a confirmar que esta habilitada, para ello entramos a mysql

$ mysql -u youruser

una vez en mysql ejecutamos

mysql> SELECT @@GLOBAL.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)

Podemos ver que se encuentra habilitado

Para deshabilitarlo podemos hacerlo de dos formas, una directamente desde mysql

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

salimos de mysql y haremos reset del servicio

Otra la que más me gusta es a través de my.cnf

ubicamos nuestro archivo my.cnf

$ mysql --help or mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

Así podemos ver el orden en que mysql busca el archivo de configuración y crearlo en caso que no lo tengamos activo.

$ touch /etc/my.cnf

Editamos y agregamos las siguientes lineas

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Como podes observar hemos quitado el ONLY_FULL_GROUP_BY de las opciones

Y como plus, si estamos trabajando en Symfony podremos inclusive indicarlo dentro de las opciones del config.yml directamente

doctrine:
    dbal:
        driver: pdo_mysql
        options:
            # PDO::MYSQL_ATTR_INIT_COMMAND
            1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

Con esto solucionaremos el problema de GROUP_BY en nuestros querys de mysql