Usar GROUP_CONCAT ordenando los registros

La función GROUP_CONCAT es muy útil para juntar los valores de otros campos u expresiones habiendo realizado previamente un agrupamiento por ciertos campos. Entonces vamos a presentar un ejemplo que iremos refinando basado en ciertas necesidades:

Suponiendo que tenemos una tabla que contiene las  etiquetas de los usuario para que marquen sus mails, y deseamos obtener el listado de los nombres de etiquetas que cada uno posee:

SELECT usuario, GROUP_CONCAT( etiqueta ) as etiquetas
FROM etiquetas_usuario
GROUP BY usuario;

Obs: recuerden que implícitamente se está realizando un orden por GROUP BY.

Ahora necesitamos que si algún usuario hubiera definido más de una etiqueta con el mismo nombre, aparezca en el listado solo una vez:

SELECT usuario, GROUP_CONCAT( DISTINCT etiqueta ) as etiquetas
FROM etiquetas_usuario
GROUP BY usuario;

Para ser más prolijos vamos a ordenar los nombres de etiquetas alfabéticamente:

SELECT usuario, GROUP_CONCAT( DISTINCT etiqueta ORDER BY etiqueta ASC ) as etiquetas
FROM etiquetas_usuario
GROUP BY usuario;

Obs: podemos omitir ASC, dado que es el sentido de ordenamiento por defecto. Podemos utilizar en su lugar DESC, y hasta ordenar por otras columnas o expresiones!

Por último, vamos a separar con un guíon medio las distintas etiquetas en el listado  (dado que por defecto se utiliza una coma):

SELECT usuario, GROUP_CONCAT( DISTINCT etiqueta ORDER BY etiqueta ASC SEPARATOR ' - ' ) as etiquetas
FROM etiquetas_usuario
GROUP BY usuario;

Para tener en cuenta:

  • los valores NULL, no se concatenan
  • se puede omitir el separador indicando SEPARATOR ''
  • el resultado de la concatenación se trunca al valor máximo indicado por la variable group_concat_max (pueden consultar el valor de esta variable en su Mysql)
Tagged with: ,
Publicado en Aplicaciones