He actualizado mi sistema e 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 la actualización a 5.7 me sale 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 en 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
Busqué en Google sobre el tema, pero no entiendo lo only_full_group_by
suficiente como para descubrir qué necesito hacer para solucionar la consulta. ¿Puedo 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.
fuente
not a GROUP BY expression
" Eso es. También podrían tener un código de error numérico y ningún mensaje.Respuestas:
Solo agregaría
group_id
a laGROUP BY
.Cuando se
SELECT
crea una columna que no forma parte deGROUP BY
ella, podría haber múltiples valores para esa columna dentro de los grupos, pero solo habrá espacio para un único valor en los resultados. Por lo tanto, la base de datos generalmente necesita que se le diga exactamente cómo convertir esos valores múltiples en un valor. Comúnmente, esto se hace con una función agregada comoCOUNT()
, etc.SUM()
,MAX()
lo digo generalmente porque la mayoría de los otros sistemas de bases de datos populares insisten en esto. Sin embargo, en MySQL anterior a la versión 5.7, el comportamiento predeterminado ha sido más indulgente porque no se quejará y luego elegirá arbitrariamente cualquier valor . También tiene unANY_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 está activando laonly_full_group_by
configuración de forma predeterminada por buenas razones, por lo que es mejor acostumbrarse a ella y hacer que sus consultas la cumplan.Entonces, ¿por qué mi respuesta simple anterior? He hecho un par de suposiciones:
1) el
group_id
es único. Parece razonable, es una 'ID' después de todo.2) el
group_name
también es único. Esto puede no ser una suposición tan razonable. Si este no es el caso y usted tiene alguna duplicadogroup_names
y, a continuación, siga mi consejo para agregargroup_id
a laGROUP BY
, es posible que ahora recibe 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 arbitrariamente.También es una buena práctica calificar todas las columnas con el nombre o alias de su tabla cuando hay más de una tabla involucrada ...
fuente
GROUP BY
cláusula en mi consulta, pero recibo este error.Puede intentar deshabilitar la
only_full_group_by
configuración ejecutando lo siguiente:MySQL 8 no acepta,
NO_AUTO_CREATE_USER
por lo que debe eliminarse.fuente
SELECT COUNT(*), t.* FROM my_table t GROUP BY col
y tiene 20-50 columnas, ¿desea pasar tanto tiempo agregando cada columna a la ¿agrupar por?SELECT @@sql_mode;
y luego agregando el resultado desde allí a my.cnf:sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
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 agrupa filas y luego selecciona 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 quizás no deseeAVG()
MIN()
MAX()
lista completaANY_VALUE()
si está seguro de que todos los resultados dentro del grupo son los mismos. Docfuente
FIRST()
método / función?ONLY_FULL_GROUP_BY
por defectoSi 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
Escriba
esc
para salir del modo de entrada:wq
para guardar y cerrar vim.sudo service mysql restart
para reiniciar MySQL.fuente
paginate
función.my.cnf
archivo era/etc
. Als nota la nueva sintaxis desdeMySQL 5.7.8:
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
ANY_VALUE()
para referirse a la columna no agregada.Desde documentos MySQL 5.7 :
fuente
ANY_VALUE
mencionado en ningún otro lugar en discusiones similares, funciona perfectamente para mí con miGROUP_BY
contains nonaggregated column
error.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 manera predeterminada.Por lo tanto, de acuerdo con el estándar SQL92 y anteriores:
( leer más en documentos )
Así por ejemplo:
Recibirá un mensaje de error después de ejecutar la consulta anterior.
¿Por qué?
Debido a que MySQL no comprende exactamente qué valores de los registros agrupados recuperar, y este es el punto.
IE digamos que tiene estos registros en su
users
tabla:Y ejecutará la consulta no válida que se muestra arriba.
Y obtendrá el error que se muestra arriba, porque hay 3 registros con nombre
John
, y es bueno, pero todos tienenemail
valores de campo diferentes .Entonces, MySQL simplemente no entiende cuál de ellos devolver en el registro agrupado resultante.
Puede solucionar este problema simplemente cambiando su consulta de esta manera:
Además, es posible que desee agregar más campos a la sección SELECCIONAR, pero no puede hacerlo, si no están agregados, pero hay muleta que podría usar (pero no se recomienda):
Ahora, usted puede preguntar, ¿por qué
ANY_VALUE
no se recomienda usar ?Debido a que MySQL no sabe exactamente qué valor de los registros agrupados recuperar, y al usar esta función, le está pidiendo que busque alguno 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 este comportamiento exista.
Por favor, si no me comprende, lea 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, puede anotar esta consulta
Lo cual es totalmente válido, de acuerdo con las reglas de MySQL.
Y así.
Es importante comprender cuál es exactamente el problema y solo entonces escribir la solución.
fuente
GROUP BY DAY(created_date)
? Parece que no funciona siDAY()
se agrega.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:Seguía recibiendo el error.
Tuve que cambiar
config/database.php
detrue
afalse
: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
fuente
Si está utilizando wamp 3.0.6 o cualquier versión superior que no sea la versión 2.5 estable, puede 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-> mysql settings-> sql_mode-> none. o desde la consola puede cambiar los valores predeterminados.
fuente
show variables like '%sql_mode%';
en la línea de comando mysql, la configuración sql_mode expondráAdición de líneas (mención abajo) en el archivo: /etc/mysql/my.cnf
Trabaja bien para mi. Versión del servidor: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)
fuente
Vaya a mysql o phpmyadmin y seleccione la base de datos, luego simplemente ejecute esta consulta y funcionará. esta trabajando bien para mi.
fuente
Para Mac:
1. Copie my-default.cnf predeterminado a /etc/my.cnf
2.Cambie sql_mode en my.cnf usando su editor favorito y configúrelo en este
3. Reinicie el servidor MySQL.
fuente
Esto es lo que me ayudó a entender todo el problema:
Y en el siguiente otro ejemplo de una consulta problemática.
Problemático:
Resuelto agregando esto al final:
Nota: Vea el mensaje de error en PHP, le dice dónde está el problema.
Ejemplo:
En este caso, faltaba la expresión # 4 en GROUP BY.
fuente
Para localhost / wampserver 3 podemos configurar sql-mode = user_mode para eliminar este error:
luego reinicie wamp o apache
fuente
Puedes agregar un
unique index
agroup_id
; si estás seguro de quegroup_id
es únicoPuede 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.
fuente
Si tiene este error con Symfony usando el generador de consultas de doctrina , y si este error es causado por un pedido por :
Preste atención a
select
la columna que deseagroupBy
y use enaddGroupBy
lugar degroupBy
:Funciona en Symfony3 -
fuente
Disculpas por no usar tu SQL exacto
Usé esta consulta para superar la advertencia de Mysql.
tenga en cuenta la clave para mí ser
fuente