mysql - stackoverflow - sql error 1055 sqlstate 42000
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 (10)
Para que la consulta sea legal en SQL92, la columna de nombre debe omitirse de la lista de selección o nombrarse en la cláusula GROUP BY.
SQL99 y versiones posteriores permiten dichos agregados no agregados por característica opcional T301 si dependen funcionalmente de las columnas GROUP BY: si existe una relación entre nombre y custid, la consulta es legal. Este sería el caso, por ejemplo, si fuera una clave principal de los clientes.
MySQL 5.7.5 y superior implementa la detección de dependencia funcional. Si el modo SQL ONLY_FULL_GROUP_BY está habilitado (que es el predeterminado), MySQL rechaza las consultas para las cuales la lista de selección, la condición HAVING o la lista ORDER BY hacen referencia a columnas no agregadas que no están nombradas en la cláusula GROUP BY ni dependen funcionalmente de ellas. .
a través de dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
Puede resolverlo cambiando el modo sql con este comando:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,''ONLY_FULL_GROUP_BY'',''''));
y ... recuerda volver a conectar la base de datos !!!
Estoy usando MySQL 5.7.13 en mi PC con Windows con WAMP Server
Aquí mi problema es al ejecutar esta consulta
SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = ''78'' AND
`status` = ''Active''
GROUP BY `proof_type`
Siempre recibo un error como este
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
¿Me puede decir la mejor solución ...
Necesito resultado como
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name | is_private | status | createdon | updatedon |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 1 | 1 | 78 | 1 | 21.1212 | 21.5454 | 1 | 1 | id_Card.docx | 0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
- Inicie sesión en phpMyAdmin
- Navegue a: Servidor: localhost: 3306 y no seleccione ninguna base de datos
- Haga clic en las variables del menú superior.
- Busque "modo sql" y edite el valor correspondiente a: NO_ENGINE_SUBSTITUTION
Eso es todo.
Hice esto en mi Ec2 y funcionó a las mil maravillas.
Abra su panel WAMP y abra el archivo de configuración MySQL. En él busque "sql_mode" si lo encuentra, configúrelo en "" else si no lo encuentra, agregue sql_mode = "" al archivo.
Reinicie el servidor MySQL y estará listo para comenzar ...
feliz codificación
Cuando el modo
only_full_group_by
de MySQL está activado, significa que se aplicarán estrictas reglas ANSI SQL cuando se use
GROUP BY
.
Con respecto a su consulta, esto significa que si
GROUP BY
de la columna
proof_type
, solo puede seleccionar dos cosas:
-
la columna
proof_type
, 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 las preguntas de MySQL
GROUP BY
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 le obligará a pensar en lo que realmente quiere hacer.
Nota: ANSI SQL amplía lo que se permite seleccionar en
GROUP BY
al incluir también columnas que
dependen funcionalmente
de la (s) columna (s) seleccionada (s).
Un ejemplo de dependencia funcional sería agrupar por una columna de clave principal en una tabla.
Dado que se garantiza que la clave primaria será única para cada registro, por lo tanto, 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).
En tu
my.ini
, escribe esto:
[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"
Depende de tu versión. O:
[mysqld]
sql_mode = ""
o simplemente elimine esto:
ONLY_FULL_GROUP_BY
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 me funciona. Usé esto porque en mi proyecto hay muchas consultas como esta, así que simplemente cambie este modo sql onli_full_group_by
Gracias... :-)
La respuesta de Dhanu K y Anil Gupta funcionó para mí, sin embargo, debe reiniciar mysql en la terminal para ver el resultado.
Por cómo se ve, creo que agrupar por múltiples columnas / campos no dañará su resultado. ¿Por qué no intentas agregar al grupo de esta manera?
GROUP BY `proof_type`, `id`
Esto se
proof_type
por
proof_type
primero y luego
id
.
Espero que esto no altere los resultados.
En algunos / la mayoría de los casos, agrupar por múltiples columnas da resultados incorrectos.
Puede deshabilitar sql_mode = only_full_group_by mediante algún comando, puede intentarlo por terminal o MySql IDE
mysql> set global sql_mode=''STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'';
mysql> set session sql_mode=''STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'';
Use cualquier solución
(1) PHPMyAdmin
si está utilizando phpMyAdmin, cambie la configuración " sql_mode " como se menciona en la siguiente captura de pantalla.
Edite la variable "modo sql" y elimine el texto "ONLY_FULL_GROUP_BY" del valor
(2) Símbolo del sistema Ejecute el siguiente comando.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,''ONLY_FULL_GROUP_BY'',''''));
(3) No use SELECT *
Use la columna relevante en la consulta SELECT. relevante significa columnas, que vienen en cláusula "group by" o columna con la función de agregado (MAX, MIN, SUM, COUNT, etc.)
Nota IMPORTANTE
Los cambios realizados utilizando el punto (1) O el punto (2) no lo establecerán PERMANENTEMENTE, y se revertirán después de cada reinicio.
Por lo tanto, debe configurar esto en su archivo de configuración (por ejemplo, /etc/mysql/my.cnf en la sección [mysqld]), para que los cambios sigan vigentes después del reinicio de MySQL:
Archivo de configuración : /etc/mysql/my.cnf
Nombre de la variable : sql_mode O sql-mode