Concatenando resultados com o group_concat() no MySql

Desde “criança” ouço dizer que processamento de banco de dados costuma ser mais rápido (mesmo que invísivel diferença a olho nu) que das linguagens server-side que o manipulam (asp, php, etc.), então me habituei a realizar o máximo de processamento de dados no banco.

Hoje eu estava criando um método num sistema, que envia email para uma grande lista, então decidi que o MySql já devia retornar todos emails numa única row, separados por vírgulas, pra isso usei o group_concat().

1º Exemplo:

1
2
SELECT group_concat( email ) AS lista
FROM usuarios

Este exemplo vai retornar todos os resultados na row lista, separados por vírgula.

lista
email1@gmail.com, email2@gmail.com, email3@gmail.com

2º Exemplo:

1
2
SELECT nivel, group_concat(email) AS lista
    FROM usuarios GROUP BY nivel

Esse exemplo tem uma melhor utilidade dessa função. Você poder concatenar resultados por grupos diferentes.
Não é necessário muita explicação, basta ver o resultado: estão agrupados por nível hierárquico (campo nivel) os emails dos usuários do sistema.

nivel lista
gerentes gerente1@email.com, gerente2@email.com
supervisores joe@email.com, marcelo@email.com, johndoe@email.com
clientes cliente001@email.com, cliente002@email.com

Fica bem melhor trabalhar dessa forma, do que usar vários loops com vários ifs.

    • Julio
    • julho 16th, 2013 5:52pm

    Excelente dica!

    Eu tenho uma tabela com os campos id, id_sub, titulo para gravar categorias e sub categorias, neste formato

    id id_sub titulo
    1 NULL LIVROS
    2 1 Livro de PHP5
    3 1 Livro de jQuery
    4 NULL EBOOKS
    5 4 ebook mysql

    Preciso “organizar” cada subcategoria (id_sub) com sua categoria (id). Como ficaria o GROUP_CONCAT() neste caso?
    Abraços e parabéns pelo post.

    • Fabio Nunes de Souza
    • outubro 20th, 2016 6:40pm

    Excelente a dica.

    • Raphael
    • novembro 1st, 2016 2:15pm

    @Julio
    uma solução seria isso

    create table categorias(
    id int not null auto_increment,
    id_sub int null,
    titulo varchar(255) not null,
    primary key (id)
    );

    insert into categorias(id_sub,titulo) values
    (NULL,’LIVROS’),
    (1,’Livro de PHP5′),
    (1,’Livro de JQuery’),
    (NULL,’EBOOKS’),
    (4,’Ebook MySQL’);

    select c2.titulo as categoria
    ,
    group_concat(c1.titulo) as subcategoria

    from categorias c1 inner join categorias c2
    on c1.id_sub = c2.id

    GROUP BY c2.titulo;

    • Leonardo
    • julho 7th, 2017 4:34pm

    Perfeito meu amigo , estou em 2017 e seu sql me ajudou numa query com 200 joins .HEHEHE. deu bom !

  1. Nenhum trackback ainda.