your the that sure sql_mode only_full_group_by error disabled disable code any_value mysql sql phpmyadmin mysql-error-1055

the - MySQL: no está en GROUP BY



only_full_group_by mysql ubuntu (5)

El sitio produce resultados, pero con SELECT COUNT y SELECT query con GROUP BY que tiene dos recuentos de resultados diferentes. Esto probablemente se deba al error que se muestra en phpmyadmin pero no en el sitio.

Las consultas:

SELECT count(DISTINCT `name`) as `numrows` FROM `users` WHERE `verified` = ''1'' SELECT `name`, `type`, `language`, `code` FROM `users` WHERE `verified` = ''1'' GROUP BY `name` ORDER BY `count` DESC LIMIT 0, 25

PhpMyAdmin proporciona el siguiente error:

1055 - ''main.users.type'' no está en GROUP BY

Al leer documentos de MySQL, todavía no estoy claro qué es lo que tengo que arreglar. Parece que no puedo entender esto.


La mejor solución a este problema es, por supuesto, usar una expresión GROUP BY completa.

Pero hay otra solución que funciona alrededor del bloqueo ONLY_FULL_GROUP_BY de la antigua extensión MySQL a GROUP BY .

SELECT name, ANY_VALUE(type) type, ANY_VALUE(language) language, ANY_VALUE(code) code FROM users WHERE verified = ''1'' GROUP BY name ORDER BY count DESC LIMIT 0, 25

ANY_VALUE() declara explícitamente lo que solía estar implícito en las operaciones incompletas GROUP BY MySQL: que el servidor puede elegir, bueno, cualquier valor para devolver.


Lo primero es ver por qué es así. Las versiones anteriores nos permitieron ser un poco negligentes: mientras que los valores de la columna agrupada se enumeran por completo (uno de cada uno sin excepciones) en el resultado, los valores de las otras columnas seleccionadas se omiten más o menos, pero el código puede No (no quiere) decir cuáles en su nombre:

- Hey, MYSQL, list the families of the street - but add a first name as well to every row. - Okay sir, but shall I use the father''s or the mother''s or...? I''m a machine, give exact orders!

Ahora que entendemos el por qué, podemos decidir si tenemos preferencias con respecto a las otras columnas. Utilizar

MAX() AS MIN() AS etc, works with strings, too

o si realmente es todo lo mismo, por ejemplo, no hay diferencia entre los valores no agregados que están relacionados con el agrupado, use

ANY_VALUE() AS

De cualquier manera, le haces saber a mysql que eres consciente de ser "equívoco" pero que realmente no quieres enfocarte en todas las columnas que no sean las agrupadas.


Necesitas tener un grupo completo por:

SELECT `name`, `type`, `language`, `code` FROM `users` WHERE `verified` = ''1'' GROUP BY `name`, `type`, `language`, `code` ORDER BY `count` DESC LIMIT 0, 25

SQL92 requiere que todas las columnas (excepto los agregados) en la cláusula select sea parte del grupo por cláusula. SQL99 afloja un poco esta restricción y establece que todas las columnas de la cláusula select deben depender funcionalmente del grupo por cláusula. MySQL por defecto permite el grupo parcial por y esto puede producir respuestas no deterministas, por ejemplo:

create table t (x int, y int); insert into t (x,y) values (1,1),(1,2),(1,3); select x,y from t group by x; +------+------+ | x | y | +------+------+ | 1 | 1 | +------+------+

Es decir, un y aleatorio se selecciona para el grupo x. Se puede evitar este comportamiento configurando @@ sql_mode:

set @@sql_mode=''ONLY_FULL_GROUP_BY''; select x,y from t group by x; ERROR 1055 (42000): ''test.t.y'' isn''t in GROUP BY


Otra solución mencionada varias veces anteriormente es desactivar ese molesto ''ONLY_FULL_GROUP_BY'', por ejemplo, como en esta publicación: Deshabilitar ONLY_FULL_GROUP_BY

Creo que esta solución es muy útil si no desea refactorizar todo el proyecto durante varias horas. Y si no le importan los valores impredecibles de las columnas que no son una lista de GROUP BY .


Simplemente deshabilite la rigurosidad para la consulta.