sábado, 13 de novembro de 2010

Subconsultas em SQL

Olá denovo...
Depois de um tempo fora, to voltando agora com uma dica importante em sql...

Durante o processo de desenvolvimento de um site me deparei com a seguinte situação: eu precisava retornar os 5 maiores valores de uma coluna e ordená-los por outra coluna diferente, rapidamente pensei em usar o comando IN, ficaria assim:

SELECT `coluna_chave`,`coluna_1`,`coluna_2` FROM `tabela` WHERE `coluna_chave` IN (SELECT `coluna_chave`,`coluna_2` FROM `tabela` ORDER BY `coluna_2` DESC LIMIT 0,5) ORDER BY `coluna_1`;

Ou seja, na consulta dentro do comando "IN" ele faria uma busca na tabela ordenando pela coluna 2 e tendo como limit 5, ou seja, seriam mostrados os cinco maiores valores da coluna 2.
O SELECT principal retornaria as linhas cuja a `coluna_chave` encontravam-se na consulta dentro do "IN" (os 5 maiores valores) e depois ordenaria pela coluna 2.

Esse comando resolveria meu problema, porém o MYSQL não suporta o comando LIMIT dentro de um comando IN.

E passaram-se mais alguns minutos pensando até que cheguei num outro comando:

SELECT `coluna_chave`,`coluna_1`,`coluna_2` FROM (SELECT `coluna_chave`,`coluna_1`,`coluna_2` FROM `tabela` ORDER BY `coluna_2` DESC LIMIT 0,5) as `tabela_2` ORDER BY `coluna_1`;

Ou seja, resolvi colocar a subconsulta no lugar tabela. Sendo assim ele busca os resultados de uma tabela gerada por uma subconsulta (subconsulta essa que retorna somento os 5 maiores valores da coluna_2) e não pela tabela completa e podendo depois disso ordenar por uma outra coluna, neste caso pela coluna_2.

Ufa... finalmente problema resolvido. Comente aqui se você enfrentou algum problema semelhante e se isso ocorrem em outros bancos.

Espero ter ajudado, nos vemos outro dia.
Abraço

Nenhum comentário:

Postar um comentário