quarta-feira, 24 de julho de 2013

Stored Procedures em Mysql via PhpMyAdmin

Problema proposto

Temos um sistema bem simples, com apenas duas tabelas e um relacionamento via chave estrangeira, conforme o diagrama:


Layout desejado

O proprietário do sistema deseja o seguinte layout de saída:


Para um município fornecido pelo parâmetro nomemun, serão apresentados somente os vídeos mais recentes (maior data) para cada categoria.

Quando não for dado nenhum município (nomemun vazio), serão apresentados os últimos vídeos por categoria, independente do município.

Relacionamento

Para um relacionamento normal, através da chave estrangeira, faríamos simplesmente:

SELECT v.Id, v.Categoria, v.Titulo, v.Idyoutube, v.Idmun, m.Municipio FROM video AS v, municipio AS m WHERE ( v.Idmun = m.Id )

Neste caso aparecem todos os videos mas sem o agrupamento por Categoria. Vamos resolver o problema utilizando a cláusula GROUP BY:

SELECT v.Id, v.Categoria, v.Titulo, v.Idyoutube, v.Idmun, m.Municipio FROM video AS v, municipio AS m WHERE ( v.Idmun = m.Id ) GROUP BY v.Categoria

Restringindo a apresentação ao último vídeo

Quando lemos "último vídeo", em termos lógicos estamos querendo dizer que o vídeo apresentado corresponde à maior data. Este campo é o útil Dtcad (data de cadastramento do video), portanto a sentença fica da seguinte forma:

SELECT v.Id, v.Categoria, v.Titulo, v.Idyoutube, v.Idmun, m.Municipio FROM video AS v, municipio AS m WHERE ( v.Idmun = m.Id AND v.Dtcad = ( SELECT MAX(DtCad) FROM video AS w WHERE w.Categoria = v.Categoria ) ) GROUP BY v.Categoria

A expressão:

v.Dtcad = ( SELECT MAX(DtCad) FROM video AS WHERE w.Categoria = v.Categoria )

faz com que seja selecionado o registro de video cuja data de cadastramento seja a maior para cada Categoria.

A Stored Procedure no PhpMyAdmin

No PhpMyAdmin, entramos nas Rotinas (Routines em inglês) do banco de dados:


A tela seguinte é:

Por um sério erro de tradução, o link recebeu o texto "Adicionar Indice", mas realmente o certo é "Adicionar Rotina", que fornece a tela a seguir, quando clicado:


A tela acima já mostra tanto o parâmetro de entrada que nós convencionamos (nomemun), do tipo varchar, comprimento 30, quanto o código da Stored Procedure, que pelo espaço insuficiente na janela, reproduzimos abaixo:

if nomemun = '' then
SELECT v.Id, v.Categoria, v.Titulo, v.Idyoutube, v.Idmun, m.Municipio FROM video AS v, municipio AS m WHERE ( v.Idmun = m.Id AND v.Dtcad = ( SELECT MAX(DtCad) FROM video AS WHERE w.Categoria = v.Categoria ) ) GROUP BY v.Categoria
else
SELECT v.Id, v.Categoria, v.Titulo, v.Idyoutube, v.Idmun, m.Municipio FROM video AS v, municipio AS m WHERE ( v.Idmun = m.Id AND m.Municipio = nomemun AND v.Dtcad = ( SELECT MAX(DtCad) FROM video AS WHERE w.Categoria = v.Categoria ) ) GROUP BY v.Categoria
end if
























Nenhum comentário:

Postar um comentário