Saltar al contenido

La lista SELECT no está en la cláusula GROUP BY y contiene una columna no agregada… incompatible con sql_mode=only_full_group_by

Si encuentras algún fallo con tu código o trabajo, recuerda probar siempre en un entorno de testing antes añadir el código al trabajo final.

Solución:

Esta

La expresión #1 de la lista SELECT no está en la cláusula GROUP BY y contiene la columna no agregada ‘returntr_prod.tbl_customer_pod_uploads.id’ que no depende funcionalmente de las columnas en la cláusula GROUP BY; esto es incompatible con sql_mode=only_full_group_by

se resolverá simplemente cambiando el modo sql en MySQL con este comando,

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

Esto también funciona para mí. Utilicé esto porque en mi proyecto hay muchas consultas como esta, así que cambié este modo sql a only_full_group_by

Gracias… 🙂

Cuando MySQL only_full_group_by está activado, significa que se aplicarán reglas estrictas de ANSI SQL al usar GROUP BY. Con respecto a su consulta, esto significa que si Ud. GROUP BY de El proof_type columna, solo puede seleccionar dos cosas:

  • los proof_type columna, o
  • agregados de cualquier otra columna

Por “agregados” de otras columnas, me refiero a usar una función agregada como MIN(), MAX()o AVG() con otra columna. Entonces, en su caso, la siguiente consulta sería válida:

SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

La gran mayoría de MySQL GROUP BY las preguntas que veo en SO tienen el modo estricto desactivado, por lo que la consulta se está ejecutando, pero con resultados incorrectos. En su caso, la consulta no se ejecutará en absoluto, lo que lo obligará a pensar en lo que realmente quiere hacer.

Nota: ANSI SQL amplía lo que se permite seleccionar en GROUP BY incluyendo también columnas que son funcionalmente dependiente en la(s) columna(s) seleccionada(s). Un ejemplo de dependencia funcional sería agrupar por un primario key columna en una tabla. Desde la primaria key se garantiza que es único para cada registro, por lo que también se determinaría el valor de cualquier otra columna. MySQL es una de las bases de datos que permite esto (SQL Server y Oracle no AFAIK).

Use cualquier solución (de las siguientes 3)

(1) PHPMyAdmin

si está utilizando phpMyAdmin, cambie el “modo_sql” configuración como se menciona en la siguiente captura de pantalla.
ingrese la descripción de la imagen aquí

Edite la variable “modo sql” y elimine el texto “ONLY_FULL_GROUP_BY” del valor

O

(2) Símbolo del sistema/SQL
Ejecute el siguiente comando.

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

O

(3) No utilice SELECCIONAR *

Use la columna relevante en la consulta SELECT. columnas de medios relevantes, que vienen en la cláusula “agrupar por” o columna con la función agregada (MAX, MIN, SUM, COUNT, etc.)


Nota IMPORTANTE

Los cambios realizados mediante el punto (1) O el punto (2) no lo configuran PERMANENTEMENTE, y se revertirá después de cada reinicio.

Por lo tanto, debe establecer esto en su archivo de configuración (por ejemplo, /etc/mysql/my.cnf en el [mysqld] sección), para que los cambios permanezcan en vigor después de reiniciar MySQL:

Archivo de configuración: /etc/mysql/my.cnf

Nombre de la variable : modo_sql O modo sql

Quitar palabra ONLY_FULL_GROUP_BY del valor y guarde el archivo.

Nota : Si no ha encontrado la variable “sql_mode” en el archivo de configuración, inserte debajo de 2 líneas al final del archivo

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

Si piensas que ha sido útil nuestro post, agradeceríamos que lo compartas con más programadores y nos ayudes a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *