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 de la cláusula GROUP BY; esto es incompatible con sql_mode = only_full_group_by
¿Puedes decirme cuál es la mejor solución?
Necesito un 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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
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 de 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í. Usé esto, porque en mi proyecto hay muchas consultas como esta, así que acabo de cambiar este modo SQL a only_full_group_by
Gracias... :-)
Cuando el only_full_group_by
modo de MySQL 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 pertenece GROUP BY
a la proof_type
columna, solo puede seleccionar dos cosas:
proof_type
columna, o
Por "agregados" de otras columnas, me refiero a usar una función de agregado 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 GROUP BY
preguntas de MySQL 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 GROUP BY
al incluir también columnas que son funcionalmente dependientes de la (s) columna (s) que se seleccionan. Un ejemplo de dependencia funcional sería agrupar por una columna de clave principal en una tabla. Dado que se garantiza que la clave principal es única para cada registro, 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).
(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 / SQL Ejecute el siguiente comando.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
(3) No use SELECT *
Utilice la columna relevante en la consulta SELECT. columnas de medios relevantes, que vienen en la cláusula "agrupar por" o en la columna con la función agregada (MAX, MIN, SUM, COUNT, etc.)
Los cambios realizados utilizando el punto (1) O el punto (2) no lo configurarán 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 la sección [mysqld]), para que los cambios sigan vigentes después de reiniciar MySQL:
Archivo de configuración : /etc/mysql/my.cnf
Nombre de la variable : sql_mode OR sql-mode
El siguiente método resolvió mi problema:
En ubuntu
Tipo: sudo vi /etc/mysql/my.cnf
escriba A para ingresar al modo de inserción
En la última línea, pegue el código de dos líneas a continuación:
[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
Escriba esc para salir del modo de entrada
Type :wq to save and close vim.
Escriba sudo service mysql restart
para reiniciar MySQL.
Puede deshabilitar sql_mode = only_full_group_by mediante algún comando, puede intentarlo mediante 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';
En Ubuntu
Paso 1:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
Paso 2: Vaya a la última línea y agregue lo siguiente
sql_mode = ""
Paso 3: guardar
Paso 4: reinicia el servidor mysql.
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 posteriores permiten tales no agregados por característica opcional T301 si son funcionalmente dependientes de las columnas GROUP BY: Si existe tal relación entre nombre y custid, la consulta es legal. Este sería el caso, por ejemplo, si fuera una clave primaria de los clientes.
MySQL 5.7.5 y versiones posteriores implementan la detección de dependencia funcional. Si el modo SQL ONLY_FULL_GROUP_BY está habilitado (que es por defecto), MySQL rechaza 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 de ellas .
a través de MySQL :: MySQL 5.7 Reference Manual :: 12.19.3 Manejo MySQL de GROUP BY
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 !!!
vaya a phpmyadmin y abra la consola y ejecute esta solicitud
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Hola, en lugar de tomar todas las columnas, solo tome lo que necesita usando ANY_VALUE(column_name)
. Funciona perfectamente. Sólo revisa.
P.ej:
SELECT proof_type,any_value("customer_name") as customer_name
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`
Busque "modo SQL" si está usando PhpMyAdmin y quite el valor:, ONLY_FULL_GROUP_BY
simplemente lo hizo y está bien.
> sudo nano /etc/mysql/my.cnf
Ingrese abajo
[mysqld]
sql_mode = ""
Ctrl + O => Y = Ctrl + X
> sudo service mysql restart
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 agrupará proof_type
primero y luego id
. Espero que esto no altere los resultados. En algunos / la mayoría de los casos, agrupar por varias columnas da resultados incorrectos.
Eso es todo.
Hice esto en mi Ec2 y funcionó a las mil maravillas.
Aquí hay una forma realmente rápida y fácil de configurarlo permanentemente
NB: la ejecución SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
es temporal y, al reiniciar el servidor, aún terminará con el error. Para solucionar este problema de forma permanente, haga lo siguiente
wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
chmod +x disable-strict-mode.sh
./disable-strict-mode.sh
Y listo, se realizarán cambios en mysql y se reiniciará
Actualización para MySQL 8.0
No sql-mode
lo tendrá, NO_AUTO_CREATE_USER
ya que se eliminó como se menciona aquí: cómo-configurar-modo-sql-en-mi-cnf-en-mysql-8
[mysqld]
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
Además, si alguien no tiene un my.cnf
archivo, crea uno nuevo /etc/my.cnf
y luego agrega las líneas anteriores.
Tuve un problema similar con parte de la trituración de mi base de datos. Lo que hice fue cambiar el parámetro en la base de datos a través de la consola de la base de datos PHPStorm así:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
funciona como un encanto ahora
¡Apáguelo only_full_group_by
solo si sabe lo que está haciendo!
Un ejemplo sencillo para demostrar el problema:
Tabla: usuarios
id | name
----------------
1 ali
2 john
3 ali
Cuando usa GROUP BY
en la name
columna:
SELECT * FROM users GROUP BY name;
Hay dos posibles resultados:
1 ali
2 john
O
2 john
3 ali
¡MYSQL no sabe qué resultado elegir! Porque hay diferentes id
pero ambos tienen name=ali
.
Solución 1:
solo seleccionando el name
campo:
SELECCIONAR nombre DE usuarios GRUPO POR nombre;
resultado:
ali
john
Solución 2:
Apagando only_full_group_by
. ¡MYSQL le mostrará uno de los dos resultados posibles que mostré antes AL AZAR! (Está bien si realmente no te importa lo id
que elija)
Solución3
Utilice una Aggregate
función como MIN()
, MAX()
para ayudar a MYSQL a decidir qué debe elegir.
por ejemplo quiero el mínimo id
:
SELECT MIN(id), name FROM users GROUP BY name;
resultado:
1 ali
2 john
Escogerá la ali
fila que tenga el mínimo id
.
La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.
Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.
Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.
Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.
Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.
Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?
Anteriormente, Kotaku informó que un hotel Godzilla se estaba abriendo en Tokio este abril. Junto al hotel, estaba programada la aparición de una enorme cabeza de 'Zilla, pero todo lo que hemos visto fueron imágenes conceptuales computarizadas.
Foto: Getty Desde que lanzó The Boring Company hace un año, Elon Musk ha mencionado varios sitios de construcción posibles para el negocio de perforación de túneles y ha descartado una vaga referencia a una aprobación gubernamental "verbal" para un túnel Hyperloop que conecta la ciudad de Nueva York y Washington. , CC. Pero ahora sabemos que al menos un alcalde quiere que Musk perfore un agujero debajo de su ciudad.
Tapas elásticas de silicona de Tomorrow's Kitchen, paquete de 12 | $14 | Amazonas | Código promocional 20OFFKINJALids son básicamente los calcetines de la cocina; siempre perdiéndose, dejando contenedores huérfanos que nunca podrán volver a cerrarse. Pero, ¿y si sus tapas pudieran estirarse y adaptarse a todos los recipientes, ollas, sartenes e incluso frutas en rodajas grandes que sobran? Nunca más tendrás que preocuparte por perder esa tapa tan específica.
Hemos pirateado algunas ciudades industriales en esta columna, como Los Ángeles y Las Vegas. Ahora es el momento de una ciudad militar-industrial-compleja.
El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.
Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon
El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.
El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".
Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.
Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.
“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.
Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.