Logo
You
Code

GROUP_CONCAT en MySql

Autor YouCode - http://www.youcode.com.ar/mysql/groupconcat-en-mysql-325

Veremos como resolver un query que a muchos les rompe la cabeza, se trata de obtrener toda una lista de categorias a partir de un campo el cual tiene los id de categorias separados por coma.

Cuantas veces necesitamos asociar un dato a muchos mas datos, por ejemplo, un usuario con muchas categorias, suele pasar que lo mas facil (y mas usando programas como PHPMAKER) es poner en un campo los ID de las categorias separado por comas , pero cuando queremos saber a que categorias pertenece un usuario nos volvemos locos porque tenemos los ID en un solo campo y separados por coma.

Bueno, aqui hacemos uso de GROUP_CONCAT con la ayuda de find_in_set de MySql obteniendo todos los usuarios y sus categorias en un solo campo.

Asumiendo que tenemos una tabla de usuarios la cual tiene un campo llamado categorias (varchar) donde separado por coma estan los id de las categorias y tenemos otra tabla llamada categorias donde estan los nombres de las categorias.

Entonces:

Tendriamos una tabla de usuarios como esta:

| idusuario    |  nombre    |  categorias
------------------------------------------------------
| 1               | pepe         | 1,2,3
| 2               | jose          | 3
| 3               | raul           | 2,3
select 
       u.nombre,
       GROUP_CONCAT(c.nombre) as nomcategoria
from
	usuarios u
join categorias c on find_in_set(c.idcategoria, u.categorias)
group by u.idusuario;
que hace el query, nos dara el resultado de la siguiente manera:

| nombre | nomcategoria
----------------------------------------------------
| pepe     | usuario admin developer
| jose      | developer
| raul       | admin developer

GROUP_CONCAT va concatenando todos los nombres de categorias en un solo campo y find_in_set busca el IDCATEGORIA que esta en el campo CATEGORIAS de la tabla de usuarios.
find_in_set(c.idcategoria, u.categorias)

facil, .....no?
 
http://www.youcode.com.ar/mysql/groupconcat-en-mysql-325