mysql

Solución a SQLSTATE 42000 Syntax error or access violation: 1055

En este post te mostraré cómo solucionar el error al hacer una consulta en MySQL. Este error viene cuando hacemos un GROUP BY y al menos a mí se me ha presentado de dos formas.

La primera es:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘una_columna_de_la_tabla’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

La segunda es:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘una_columna_de_la_tabla’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Veamos cómo solucionar este error 42000 de MySQL.

Explicando el problema

Comencemos viendo un ejemplo de una consulta que genera este error:

select turnos.numero, profesionales.nombre from turnos
inner join profesionales
on turnos.id_profesional = profesionales.id
and turnos.id_profesional is not null
and turnos.estado = 'ATENDIENDO'
and turnos.fecha = ?
group by profesionales.id;

No te confundas con la consulta. Solo fíjate en que estamos haciendo un GROUP BY, agrupando por profesionales.id.

Pues bien, justamente eso genera el segundo error que cito.

La solución: coloca todas las columnas en el group by

La solución es poner en el GROUP BY todas las columnas que están en el SELECT. Así que la consulta de arriba cambia a:

select turnos.numero, profesionales.nombre from turnos
inner join profesionales
on turnos.id_profesional = profesionales.id
and turnos.id_profesional is not null
and turnos.estado = 'ATENDIENDO'
and turnos.fecha = ?
group by profesionales.id, turnos.numero, profesionales.nombre;

Lo único que hice fue mover las columnas que estaban en el SELECT (turnos.numero, profesionales.nombre) al GROUP BY.

Si lo quieres ver con colores, mira el commit que hice

Segundo problema: con order by

Si haces un GROUP BY pero usas ORDER BY, debes usar las columnas de ORDER BY en GROUP BY. Es decir, la siguiente consulta causa el primer error citado:

select turnos.numero, profesionales.nombre from turnos
inner join profesionales
on turnos.id_profesional = profesionales.id
and turnos.id_profesional is not null
and turnos.estado = 'ESPERANDO'
and turnos.fecha = ?
group by profesionales.id, turnos.numero, profesionales.nombre
order by hora asc
limit 5

Ya que estoy usando la columna hora en el ORDER BY pero esa columna no está en el GROUP BY. La solución es:

select turnos.numero, profesionales.nombre from turnos
inner join profesionales
on turnos.id_profesional = profesionales.id
and turnos.id_profesional is not null
and turnos.estado = 'ESPERANDO'
and turnos.fecha = ?
group by profesionales.id, turnos.numero, profesionales.nombre, hora
order by hora asc
limit 5

Simplemente tuve que agregar la columna hora al final del GROUP BY.

Conclusión

En resumen este tipo de errores se solucionan agregando todas las columnas usadas dentro del GROUP BY.

Otra posible solución sería cambiando la variable sql_mode pero esto que explico lo hago suponiendo que no queremos hacerlo o que no tenemos acceso al servidor de MySQL para modificarla.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Excelente, funciono perfectamente. En mi caso fue el primer paso de esta publicación. Gracias por tu aporte.

  • no es asi hombre, si sabes la funcion del groupBy?, si esque se pone en el groubBy todo lo que esta en el select entonces ya no tendria caso usa el grouBy.

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.