He actualizado mi sistema y he instalado MySql 5.7.9 con php para una aplicación web en la que estoy trabajando. Tengo una consulta que se crea dinámicamente y, cuando se ejecuta en versiones anteriores de MySql, funciona bien. Desde que actualicé a 5.7 recibo este error:
La expresión # 1 de la lista SELECT no está en la cláusula GROUP BY y contiene la columna no agregada 'support_desk.mod_users_groups.group_id' que no depende funcionalmente de las columnas de la cláusula GROUP BY; esto es incompatible con sql_mode = only_full_group_by
Tenga en cuenta la página del manual para Mysql 5.7 sobre el tema de los modos SQL del servidor .
Esta es la consulta que me está dando problemas:
SELECT mod_users_groups.group_id AS 'value',
group_name AS 'text'
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id
WHERE mod_users_groups.active = 1
AND mod_users_groups.department_id = 1
AND mod_users_groups.manage_work_orders = 1
AND group_name != 'root'
AND group_name != 'superuser'
GROUP BY group_name
HAVING COUNT(`user_id`) > 0
ORDER BY group_name
Hice algunas búsquedas en Google sobre el problema, pero no entiendo lo only_full_group_by
suficiente como para averiguar qué debo hacer para solucionar la consulta. ¿Puedo simplemente desactivar la only_full_group_by
opción o hay algo más que deba hacer?
Déjeme saber si usted necesita más información.
Solo agregaría group_id
al GROUP BY
.
Cuando se SELECT
ingresa una columna que no es parte de, GROUP BY
podría haber múltiples valores para esa columna dentro de los grupos, pero solo habrá espacio para un solo valor en los resultados. Por lo tanto, la base de datos generalmente necesita saber exactamente cómo convertir esos valores múltiples en un valor. Comúnmente, esto se hace con una función de agregado como COUNT()
, SUM()
, MAX()
etc ... Digo generalmente porque la mayoría de otros sistemas de bases de datos populares insisten en esto. Sin embargo, en MySQL antes de la versión 5.7, el comportamiento predeterminado ha sido más indulgente porque no se queja y luego elige arbitrariamente cualquier valor . También tiene una ANY_VALUE()
función que podría usarse como otra solución a esta pregunta si realmente necesitara el mismo comportamiento que antes. Esta flexibilidad tiene un costo porque no es determinista, por lo que no la recomendaría a menos que tenga una muy buena razón para necesitarla. MySQL ahora activa la only_full_group_by
configuración de forma predeterminada por buenas razones, por lo que es mejor acostumbrarse y hacer que sus consultas la cumplan.
Entonces, ¿por qué mi simple respuesta anterior? Hice un par de suposiciones:
1) el group_id
es único. Parece razonable, después de todo es una 'identificación'.
2) el group_name
también es único. Esta puede no ser una suposición tan razonable. Si este no es el caso y tiene algunos duplicados group_names
y luego sigue mi consejo para agregar group_id
al GROUP BY
, es posible que ahora obtenga más resultados que antes porque los grupos con el mismo nombre ahora tendrán filas separadas en los resultados. Para mí, esto sería mejor que tener estos grupos duplicados ocultos porque la base de datos ha seleccionado discretamente un valor de forma arbitraria.
También es una buena práctica calificar todas las columnas con su nombre de tabla o alias cuando hay más de una tabla involucrada ...
SELECT
g.group_id AS 'value',
g.group_name AS 'text'
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id
WHERE g.active = 1
AND g.department_id = 1
AND g.manage_work_orders = 1
AND g.group_name != 'root'
AND g.group_name != 'superuser'
GROUP BY
g.group_name,
g.group_id
HAVING COUNT(d.user_id) > 0
ORDER BY g.group_name
Puede intentar deshabilitar la only_full_group_by
configuración ejecutando lo siguiente:
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';
MySQL 8 no acepta, NO_AUTO_CREATE_USER
por lo que debe eliminarse.
puede desactivar el mensaje de advertencia como se explica en las otras respuestas o puede comprender lo que está sucediendo y solucionarlo.
A partir de MySQL 5.7.5, el modo SQL predeterminado incluye ONLY_FULL_GROUP_BY, lo que significa que cuando está agrupando filas y luego seleccionando algo de esos grupos, debe decir explícitamente de qué fila debe hacerse esa selección.
Mysql necesita saber qué fila del grupo está buscando, lo que le brinda dos opciones
group by rect.color, rect.value
que puede ser lo que desea en algunos casos, de lo contrario, devolvería resultados duplicados con el mismo color que es posible que no deseeAVG()
MIN()
MAX()
lista completa ANY_VALUE()
si está seguro de que todos los resultados dentro del grupo son iguales. DocSi no desea realizar ningún cambio en su consulta actual, siga los pasos a continuación:
sudo vim /etc/mysql/my.cnf
A
para ingresar al modo de inserciónCopiar y pegar
[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
:wq
para guardar y cerrar vim.sudo service mysql restart
para reiniciar MySQL.Use ANY_VALUE()
para referirse a la columna no agregada.
SELECT name, address , MAX(age) FROM t GROUP BY name; -- fails
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; -- works
De los documentos de MySQL 5.7 :
Puede lograr el mismo efecto sin deshabilitar
ONLY_FULL_GROUP_BY
usandoANY_VALUE()
para referirse a la columna no agregada....
Esta consulta puede no ser válida con
ONLY_FULL_GROUP_BY
habilitada porque la columna de dirección no agregada en la lista de selección no se nombra en laGROUP BY
cláusula:SELECT name, address, MAX(age) FROM t GROUP BY name;
...
Si sabe que, para un conjunto de datos dado, cada valor de nombre de hecho determina de forma única el valor de la dirección, la dirección depende funcionalmente del nombre. Para decirle a MySQL que acepte la consulta, puede usar la
ANY_VALUE()
función:SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
Intentaré explicarte de qué se trata este error.
A partir de MySQL 5.7.5, la opción ONLY_FULL_GROUP_BY
está habilitada de forma predeterminada.
Por lo tanto, de acuerdo con el estándar SQL92 y anteriores:
no permite 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 (determinadas únicamente por) columnas GROUP BY
Así por ejemplo:
SELECT * FROM `users` GROUP BY `name`;
Recibirá un mensaje de error después de ejecutar la consulta anterior.
# 1055 - La expresión # 1 de la lista SELECT no está en la cláusula GROUP BY y contiene la columna no agregada 'testsite.user.id' que no depende funcionalmente de las columnas de la cláusula GROUP BY; esto es incompatible con sql_mode = only_full_group_by
¿Por qué?
Debido a que MySQL no entiende exactamente qué valores de los registros agrupados se deben recuperar, y este es el punto.
Es decir, digamos que tiene estos registros en su users
tabla:
Y ejecutará la consulta no válida mostrada arriba.
Y obtendrá el error que se muestra arriba, porque hay 3 registros con nombre John
, y está bien, pero todos tienen email
valores de campo diferentes .
Entonces, MySQL simplemente no comprende cuál de ellos devolver en el registro agrupado resultante.
Puede solucionar este problema, simplemente cambiando su consulta de esta manera:
SELECT `name` FROM `users` GROUP BY `name`
Además, es posible que desee agregar más campos a la sección SELECT, pero no puede hacerlo, si no están agregados, pero hay una muleta que podría usar (pero no se recomienda):
SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`
Ahora, puede preguntar, ¿por qué ANY_VALUE
no se recomienda su uso?
Debido a que MySQL no sabe exactamente qué valor de registros agrupados recuperar, y al usar esta función, le pide que obtenga cualquiera de ellos (en este caso, se obtuvo el correo electrónico del primer registro con nombre = John).
Exactamente, no puedo pensar en por qué querrías que existiera este comportamiento.
Por favor, si no me entiendes, lee más sobre cómo funciona la agrupación en MySQL, es muy simple.
Y al final, aquí hay una consulta más simple pero válida.
Si desea consultar el recuento total de usuarios según las edades disponibles, es posible que desee escribir esta consulta
SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;
Lo cual es totalmente válido, según las reglas de MySQL.
Y así.
Es importante comprender cuál es exactamente el problema y solo entonces escribir la solución.
Estoy usando Laravel 5.3, mysql 5.7.12, en laravel homestead (0.5.0, creo)
Incluso después de configurar explícitamente la edición /etc/mysql/my.cnf
para reflejar:
[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
Seguía recibiendo el error.
Tuve que cambiar config/database.php
de true
a false
:
'mysql' => [
'strict' => false, //behave like 5.6
//'strict' => true //behave like 5.7
],
Otras lecturas:
https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel -5-2
Si está utilizando wamp 3.0.6 o cualquier versión superior que no sea la 2.5 estable, podría enfrentar este problema, en primer lugar, el problema es con sql. tienes que nombrar los campos en consecuencia. pero hay otra forma de resolverlo. haga clic en el icono verde de wamp. mysql-> configuración de mysql-> sql_mode-> ninguno. o desde la consola puedes cambiar los valores predeterminados.
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';
Vaya a mysql o phpmyadmin y seleccione la base de datos, luego simplemente ejecute esta consulta y funcionará. esta trabajando bien para mi.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Adición de líneas (mencionar más abajo) en el archivo: /etc/mysql/my.cnf
[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
Funciona bien para mi. Versión del servidor: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)
Para Mac:
1.Copie el my-default.cnf predeterminado en /etc/my.cnf
sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf
2.Cambie sql_mode en my.cnf usando su editor favorito y configúrelo en este
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
3. Reinicie el servidor MySQL.
mysql.server restart
Esto es lo que me ayudó a comprender todo el problema:
Y a continuación, otro ejemplo de una consulta problemática.
Problemático:
SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
AND cookieid = #
Resuelto agregando esto al final:
GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress
Nota: Vea el mensaje de error en PHP, le indica dónde radica el problema.
Ejemplo:
Error de consulta de MySQL 1140: en una consulta agregada sin GROUP BY, la expresión # 4 de la lista SELECT contiene la columna no agregada 'db.gameplay.timestamp'; esto es incompatible con sql_mode = only_full_group_by - Consulta: SELECT COUNT (*) como intentos, SUM (transcurrido) como transcurridototal, ID de usuario, marca de tiempo, questionid, answerid, SUM (correcto) como correcto, transcurrido, dirección IP DESDE el juego DONDE marca de tiempo> = FECHA_SUB (AHORA (), INTERVALO 1 DÍA) Y ID de usuario = 1
En este caso, faltaba la expresión # 4 en GROUP BY.
Para localhost / wampserver 3 podemos establecer sql-mode = user_mode para eliminar este error:
click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode
luego reinicia wamp o apache
Puede agregar un unique index
a group_id
; si está seguro de que group_id
es único.
Puede resolver su caso sin modificar la consulta .
Una respuesta tardía, pero aún no se ha mencionado en las respuestas. Tal vez debería completar las respuestas ya completas disponibles. Al menos resolvió mi caso cuando tuve que dividir una tabla con demasiados campos.
Si tiene este error con Symfony usando el generador de consultas de doctrine , y si este error es causado por un orderBy :
Preste atención a select
la columna que desea groupBy
y utilice en addGroupBy
lugar de groupBy
:
$query = $this->createQueryBuilder('smth')->addGroupBy('smth.mycolumn');
Funciona en Symfony3 -
Disculpas por no usar tu SQL exacto
Usé esta consulta para superar la advertencia de Mysql.
SELECT count(*) AS cnt, `regions_id`
FROM regionables
WHERE `regionable_id` = '115' OR `regionable_id` = '714'
GROUP BY `regions_id`
HAVING cnt > 1
nota la clave para mi ser
count(*) AS cnt
Tuve que editar el siguiente archivo en mi Ubuntu 18.04:
/etc/mysql/mysql.conf.d/mysqld.cnf
con
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
y
sudo service mysql restart
La respuesta de consenso anterior es buena, pero si tiene problemas para ejecutar consultas dentro de los procedimientos almacenados después de arreglar su archivo my.cnf, intente cargar sus SP nuevamente.
Sospecho que MySQL debe haber compilado los SP con el valor predeterminado only_full_group_by establecido originalmente. Por lo tanto, incluso cuando cambié my.cnf y reinicié mysqld, no tuvo ningún efecto en los SP, y siguieron fallando con "La lista SELECT no está en la cláusula GROUP BY y contiene una columna no agregada ... que no depende funcionalmente de las columnas en GROUP BY cláusula; esto es incompatible con sql_mode = only_full_group_by ".
La recarga de los SP debe haber provocado que se recompilen ahora con only_full_group_by desactivado. Después de eso, parecen funcionar como se esperaba.
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?
Si este tráiler de pesadilla de la temporada más reciente de Great British Bake Off te asustó y te hizo no volver a ver el programa, es posible que tengas suerte: PBS no ha decidido si se transmitirá o no la última temporada en los Estados Unidos. actualización, para aquellos que no siguen sin aliento este tipo de drama de nicho: el presentador Paul Hollywood y la hermosa carpa llena de batidoras de colores pastel y cuadros se trasladaron de la BBC al Canal 4; Mary Berry, Sue Perkins y Mel Giedroyc renunciaron.
Foto: Netflix Oh, Hello On Broadway (Netflix): Después de llegar a Broadway el año pasado, los dos locos del Upper West Side interpretados por John Mulaney y Nick Kroll finalmente llegaron a Netflix. El especial consta del espectáculo en el escenario, algunos momentos entre bastidores y un invitado muy especial de “Too Much Tuna”.
¿Quiere probar un cepillo de dientes Sonicare sin gastar mucho dinero en uno de sus modelos favoritos de gama alta? Puede comprar un kit de la Serie 2 o Serie 3 por tan solo $ 30 hoy en Amazon. Haga clic aquí para ver la lista completa de modelos elegibles y tenga en cuenta que se descontarán $ 10 adicionales en su carrito.
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.
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.