GROUP BY, ¿para qué sirve Agrupar Datos en una Tabla Mysql?


Si recurrimos a la teoría nos encontraremos con que la sentencia group by sirve para agrupar datos, según un determinado criterio, y aplicar operaciones sobre los elementos del conjunto conformado.

La definición resulta un poco confusa, por lo tanto veamos la utilidad que tiene la consulta group by a través de un ejemplo práctico.

Cuando vimos la consulta inner join en mysql trabajamos con dos tablas. Una tabla mysql contenía nombres de Empresas y la otra tabla contenía los Servicios que ellas brindaban.


Necesitas hosting para un nuevo sitio? Buscas mejorar tu servicio actual?
Yo utilizo y te recomiendo InterServer, te brindan espacio en disco ilimitado y múltiples dominios por cuenta a sólo $5 usd mensual. >> Más detalles

Supongamos que ahora nos interesa saber la cantidad de servicios que brinda una determinada empresa. Retomando la definición teórica que vimos al inicio, la solución a esta consigna podríamos pensarla de la siguiente manera:

Conformaremos un grupo (agrupar datos) por cada empresa (criterio) y dentro de cada grupo contabilizaremos (operación) la cantidad de servicios que ofrece.

Nuestra consulta mysql quedaría así:

select Empresas.Nombre,Servicios.Servicio,count(*) as CantidadServicios	from Empresas		inner join Servicios on Empresas.Id=Servicios.IdEmpresa			group by IdEmpresa

Observemos que en la línea número 4 especificamos la consulta group by. Es muy importante respetar el orden de las sentencias mysql (select, from, inner join, group by, etc). Por ejemplo, si haríamos el group by antes del inner join no funcionaria como deseamos.

En el group by especificamos “IdEmpresa”. Este vendría a ser el criterio por el cual deseamos agrupar las filas; en nuestro caso deseamos agrupar todas las filas que correspondan a la misma empresa.

Una vez que tenemos armados los grupos, contabilizamos las filas que contiene cada uno. Esto lo hacemos en la línea 1 de nuestra consulta mysql mediante count(*) y volcamos el resultado del conteo dentro del campo “CantidadServicios”.

Cada grupo representará una fila en el resultado final de nuestra consulta mysql group by. Y como hemos aprendido previamente podemos utilizar la sentencia mysql_fetch_array para imprimir en pantalla los resultados de una consulta msyql.

Finalmente el código fuente php completo quedaría de la siguiente manera:

// Conexión a base de datos Mysql$conexion=mysql_connect('localhost','Tu-Usuario-Mysql','Contraseña-de-tu-Usuario-Mysql');mysql_select_db('Nombre-de-tu-Base-de-datos-Mysql',$conexion);//	Consulta Mysql donde aplicamos GROUP BY$consulta_mysql="select Empresas.Nombre,Servicios.Servicio,count(*) as CantidadServicios					from Empresas						inner join Servicios on Empresas.Id=Servicios.IdEmpresa							group by IdEmpresa";$resultado_consulta_mysql=mysql_query($consulta_mysql,$conexion);// Imprimimos en pantalla los resultados de nuestra consulta mysqlwhile($fila=mysql_fetch_array($resultado_consulta_mysql)){ echo "La empresa ".$fila['Nombre']." ofrece ".$fila['CantidadServicios']." a sus clientes.";}

En este caso nos interesaba “contar” la cantidad de filas que conformaban cada grupo. Pero también se pueden efectuar otras operaciones.

Una operación muy utilizada es sum y sirve para efectuar sumatorias de valores contenidos en un grupo. ¿Qué utilidad tiene esto? Muchas!, por ejemplo en la tienda virtual (e-commerce) php que venimos desarrollando, la operación sum del group by nos servirá para calcular el importe total de compra en el carrito del cliente (estaríamos haciendo una sumatoria de los importes de cada ítem).

¿Para qué situación específica utilizas group by en tus proyectos de software? Compartilo con toda la comunidad de programadores dejando un comentario :-)


Nota del autor: Busco programadores y diseñadores freelance para colaborarme con proyectos. Mostrame tus trabajos desarrollados, escribime!


Te agradaría derivar tu proyecto a un programador con años de experiencia?

Ing. Diego Angelini.
Autor de BlogdePHP.com
Programador Web Freelance






Porfolio de proyectos
  • Sistemas_millenium

    quiero que en una consulta de mysql los agrupe por fechassegun el rango de fechas seleccionadascomo lo haria ???osea que se vea asi:fecha1aaaabbbcccddddfecha2aaaabbbcccdddcomo lo haria ??en php y los datos son del mysql

  • http://www.blogdephp.com/ BlogdePhp.com

    Hola, gracias por tu consulta.

    Con qué formato tienes guardas las fechas? Podrías copiarnos y pegarnos la fecha de alguna fila para que veamos su formato?

    Cuando ingresas la fila, si podrías poner poner un campo adicional en la tabla, podrías especificar algún patrón común para todas las fechas (que luego te permita agrupar). Por ejemplo, Octubre-2011, Noviembre-2011, Diciembre-2011.

    Si no puedes hacer esto, no habría manera de agrupar las fechas. En este caso te recomendaría hacer un filtro de filas según el rango de fechas que deseas. Aquí no sería necesario agrupar con group by, simplemente trabajarías con condicionales en la cláusula “where” de tu consulta mysql.

  • leonardo gonzalez caracoza

    y si quieres mostrar no sólo la cantidad de servicios, sino también los servicios? p.ej:

    | Empresas.nombre | Cantidad | ServiviosJuntos |
    |—————————————————————————–|
    | empresa1 | 2 | servicio1,servicio3 |
    | empresa2 | 3 | servicio1,servicio2,servicio4 |
    …..