sirve - sintaxis group by mysql
Error de sintaxis o violación de acceso: 1055 La expresión n.º 8 de la lista SELECCIONAR no está en la cláusula GROUP BY y contiene una columna no agregada (5)
Probé el "Tutorial de Bookmaker" 3.PH de CakePHP y seguí las instrucciones paso a paso. Desafortunadamente, al final del primer capítulo recibo el error adjunto:
Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #8 of SELECT list
is not in GROUP BY clause and contains nonaggregated column ''wis.Tags.id'' which is not
functionally dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by
Además, obtengo la información para verificar mi tabla "BookmarksTags" pero no tengo que crear una antes. Estoy un poco confundido.
Please try correcting the issue for the following table aliases:
BookmarksTags
Ya googleé mi problema y encontré información para actualizar el "my.cnf" con una línea adicional. Ya lo intenté pero no pasó nada. También compruebo la ortografía y descargué el "bookmarker-tutorial" de github, pero sigo recibiendo el error anterior.
Yo uso MySQL 5.7.11 y PHP 5.6.14.
Esto es algo nuevo en MySQL 5.7 y es una advertencia de que su consulta es ambigua.
Considera la siguiente tabla:
id | name | age | points
--------------------------------------------
1 Bob 21 1
2 James 14 1
3 Bob 21 3
4 James 14 2
5 Casey 17 3
Si hiciste la siguiente consulta:
SELECT name, age, SUM(points) FROM scores GROUP BY name
Luego, la columna de name
se usa para agrupar. Tenga en cuenta que la age
puede tener valores múltiples, por lo que es "no agregada". Debe hacer algo para contraer esos valores.
El comportamiento en 5.6 y anteriores consistía simplemente en elegir el primero según el orden de clasificación, aunque a veces era impredecible y fallaba. En 5.7 te están impidiendo hacerlo en primer lugar.
La solución aquí es agruparlo también, o aplicarle un operador agregado como MIN()
.
Acabo de tropezar con el mismo problema.
Una forma sencilla de hacer que el tutorial "funcione" sin cambiar la consulta podría ser restablecer sql_mode
en config/app.php
:
''Datasources'' => [
''default'' => [
''className'' => ''Cake/Database/Connection'',
''driver'' => ''Cake/Database/Driver/Mysql'',
''persistent'' => false,
''host'' => ''localhost'',
...
''init'' => ["SET sql_mode = ''''"],
],
Si bien esto debería hacer que las cosas funcionen, probablemente no se recomienda en casos de la vida real.
Estoy usando Laravel 5.4 y estoy enfrentando el mismo problema.
Intento establecer strict
en false
en config/database.php
y funciona.
''connections'' => [
''mysql'' => [
''strict'' => false,
]
]
Sin embargo, es mejor editar la consulta SQL que suprimir su advertencia.
Este puede ser el problema relacionado con la versión más nueva de MySQL, como dijiste que estás utilizando MySQL 5.7.11. Para resolver este problema para todos tus sitios, mira esto.
la respuesta por comunidad para agregar la línea a continuación
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 el archivo /etc/mysql/my.cnf y guardándolo; y luego de reiniciar el servidor
sudo service mysql restart
Haría el trabajo
Además del comentario de tadman, para el tutorial que está siguiendo, debe agrupar su consulta de selección sql en Bookmarks.id y BookmarksTags.tag_id, en lugar de solo en Bookmarks.id
Para hacer eso, en el archivo BookmarksTable.php, línea
->distinct([''Bookmarks.id''])
debería verse como
->distinct([''Bookmarks.id'', ''BookmarksTags.tag_id''])