MYSQL - Utilizando UNION e multiplas queries para agrupar resultados


Um comando muito pouco utilizado é o UNION mas ele é extremamente útil quando queremos efetuar selects de uma tabela ou várias e uni-las em um único resultado.
Isto permite ao programa que receber os dados poder trata-los de uma unica vez ao invés de ter de efetuar vários selects separadamente e junta-los.

Neste post vamos trabalhar com duas coisas interessantes que são o comando UNION e SELECTS de uma mesma tabela mas com diferentes critérios.

Vamos utilizar como base a tabela 'teste' abaixo

id nome idade estado
1 Pedro 50 SP
2 Antonio 30 RJ
3 Amélia 20 SP
4 Marta 15 RJ
5 Maria 80 SP

O objetivo é selecionar a maior idade da tabela. Podemos fazer isto de maneira muito fácil pelo comando abaixo:

SELECT MAX(idade) FROM teste

idade
80

Ótimo, porém o problema é que apenas recuperamos o valor da idade máxima, sem as informações sobre quem possui esta idade, ou seja, não trouxemos a linha inteira.

Para que possamos fazer isto podemos utilizar o comando abaixo:

SELECT * FROM teste ORDER BY idade DESC LIMIT 1

id nome idade estado
5 Maria 80 SP

ou seja, ordenamos os valores por idade do maior para o menor e mandamos o SQL nos retornar apenas a primeira linha.

Bem, nosso problema parece quase solucionado.
Se quisermos uma lista das maiores idades por estado então teremos de fazer duas consultas distintas, uma filtrando por um estado e outra consulta filtrando pelo segundo estado.

Para unir os dois selects em um único resultado utilizamos o UNION:

(SELECT * FROM teste WHERE estado = 'SP' ORDER BY idade DESC LIMIT 1) UNION (SELECT * FROM teste WHERE estado = 'RJ' ORDER BY idade DESC LIMIT 1)

id nome idade estado
5 Maria 80 SP
2 Antonio 30 RJ

e assim temos em uma única saída (Query) os resultados que de outra forma precisariamos tratar em duas queries separadas.

É isso ai.

Comentários

Postagens mais visitadas deste blog

PHP - Utilizando proxy e CURL para acessar servidores ou sites

MySQL - Cálculo de período de tempo entre duas datas com TIMESTAMPDIFF

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()