1
respuesta

ERROR sql_mode=only_full_group_by

Hola, siguiendo este video me lanzo el siguiente error de lo ultima ejecucion del proyecto

Caused by: java.sql.SQLSyntaxErrorException: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'tienda.items1_.cantidad' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:972)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
    ... 18 more

Gracias a Braulio Jaffett Robles Loredo pude solucionarlo con la modificacion del codigo en el ORDER BY:

+"ORDER BY item.cantidad DESC"; //ANTES - EL ERROR
+ "ORDER BY SUM(item.cantidad) DESC";  // LINEA MODIFICADA  - LA SOLUCIÓN

Pero sigo sin entender porque esta el error o como solucionarlo sin el SUM(), ¿alguien sabe?

1 respuesta

Hola Vicente,

Muy bien, gracias por compartir tu solución. El error se debe a una configuración en MySQL llamada ONLY_FULL_GROUP_BY que está diseñada para evitar consultas ambiguas que podrían dar resultados inesperados.

Cuando se utiliza la cláusula GROUP BY, MySQL espera que todas las columnas en la cláusula SELECT estén presentes en la cláusula GROUP BY o que sean utilizadas con una función de agregación, como SUM(), AVG(), MAX(), etc.

En el caso, al intentar ordenar los resultados por la columna 'cantidad' que no está incluida en la cláusula GROUP BY y no se utiliza con una función de agregación. Por eso MySQL te está dando este error.

La solución que encontraste, ORDER BY SUM(item.cantidad) DESC, funciona porque estás utilizando la columna 'cantidad' con una función de agregación, en este caso SUM(), que es lo que MySQL espera.

Si quieres solucionarlo sin usar SUM(), tendrías que incluir la columna 'cantidad' en tu cláusula GROUP BY. Sin embargo, esto podría cambiar los resultados de tu consulta, dependiendo de los datos en tu tabla.

Por ejemplo, si tienes la siguiente consulta:

+"GROUP BY producto.nombre, item.cantidad "
+"ORDER BY item.cantidad DESC";

Esto agrupará tus resultados tanto por 'nombre' como por 'cantidad', y luego los ordenará por 'cantidad'. Pero ten en cuenta que esto puede no darte los resultados que esperas, ya que ahora estás agrupando por 'cantidad' además de por 'nombre'.

Espero que esto aclare tu duda. Mucho éxito en todo lo que te propongas y si tienes más duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios.