Archive for the ‘ SQL ’ Category

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.

Cláusula similar ao LIMIT no SQL Server

Há tempos venho desenvolvendo sistemas usando PHP + SQLServer, e uma das coisas que senti muita falta inicialmente (neste caso, pra gerar uma paginação de resultados) foi a cláusula LIMIT, ausente na linguagem de queries da Microsoft.
Mas isso realmente não é um problema pra quem usa alguma plataforma da MS para o desenvolvimento, como VB ou .NET, que já dispõem de ferramentas para paginação, mas como não é o meu caso…

Nesta solução eu uso 3 queries aninhadas. Bastar executar e dar uma olhada pra entender como funciona.

DECLARE @page INT = 1
DECLARE @perPage INT = 10
 
SELECT * FROM
(
    SELECT TOP (@perPage) nome, telefone, email FROM
    (
        SELECT TOP (@page * @perPage) nome, telefone, email FROM clientes
        ORDER BY nome ASC
    ) AS novaTabela1 ORDER BY nome DESC
) AS novaTabela2 ORDER BY nome ASC