Ir para conteúdo
Fórum Script Brasil
  • 0

Agrupar resultado


Nelma

Pergunta

Boa tarde

Estou montando um relatório da seguinte forma:

Relacionar as unidades da PM em cada estado, sendo que os estados serão agrupados por região.

O selec esta da seguinte forma:

$query = mysql_query("SELECT policia_militar.descricao_pm, policia_militar.url_pm,estado.cod_estado, regiao.cod_regiao, regiao.regiao FROM regiao, estado, policia_militar WHERE regiao.cod_regiao = estado.cod_regiao AND estado.cod_estado = policia_militar.cod_estado GROUP BY regiao.cod_regiao, estado.cod_estado");
 while($result = mysql_fetch_row($query))
 {
    print "<tr>";
    print "<td height=\"20\" colspan=\"2\" align=\"center\" valign=\"middle\" class=\"tit_news\">$result[4]</td>";
    print "</tr>";

    print "<tr>";
    print "<td width=\"300\" height=\"25\" align=\"left\" valign=\"middle\" class=\"fonte\" bgcolor=\"#F0F0F0\">$result[0]</td>";
    print "<td width=\"300\" align=\"left\" valign=\"middle\" bgcolor=\"#F0F0F0\"><a href=\"$result[1]\" target=\"self\" class=\"a_news\">$result[1]</a></td>";
    print "</tr>";                        
 }

O problema é q a região tb está aparencendo mais de uma vez (para cada estado). E eu gostaria que a região aparecesse apenas uma vez.

Valeu pela atenção

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
O problema é q a região tb está aparencendo mais de uma vez (para cada estado). E eu gostaria que a região aparecesse apenas uma vez.
Isto ocorre porque o group retorna apenas uma linha de cada agrupamento. Se em algum momento a região continua a mesma, mas o estado muda, haverá mais que uma linha com a mesma região, mas apenas um estado. A menos, é claro que os outros campos para este mesmo estado também possam variar - daí o processo se repete.

fiquei curioso quanto ao seu SELECT ter este aspecto:

SELECT policia_militar.descricao_pm, policia_militar.url_pm,estado.cod_estado, regiao.cod_regiao, regiao.regiao 
FROM regiao, estado, policia_militar 
WHERE regiao.cod_regiao = estado.cod_regiao AND estado.cod_estado = policia_militar.cod_estado 
GROUP BY regiao.cod_regiao, estado.cod_estado

e não acusar erro. Até onde sei, a regra básica para GROUP BY é que: todas as colunas no SELECT que não sejam funções de agregação (SUM, MAX, MIN,...) devem ser repetidas na cláusula GROUP BY.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
fiquei curioso quanto ao seu SELECT ter este aspecto:

SELECT policia_militar.descricao_pm, policia_militar.url_pm,estado.cod_estado, regiao.cod_regiao, regiao.regiao 
FROM regiao, estado, policia_militar 
WHERE regiao.cod_regiao = estado.cod_regiao AND estado.cod_estado = policia_militar.cod_estado 
GROUP BY regiao.cod_regiao, estado.cod_estado

e não acusar erro. Até onde sei, a regra básica para GROUP BY é que: todas as colunas no SELECT que não sejam funções de agregação (SUM, MAX, MIN,...) devem ser repetidas na cláusula GROUP BY.

Abraços

Oi, Micheus!

O erro ocasionado aí não aparece para o usuário, mas traduz-se em perda de performance, pois o otimizador de consulta do MySQ usará o GROUP BY para fazer as vezes do ORDER BY.

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia

Como eu posso resolver esse problema?

Eu achei q se separasse as tabelas (policia_militar, estado e regiao), fosse o correto, para não duplicar a regiao. Sendo q há vários estados para uma certa região.

Agradeço pelas explicações...

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia

Como eu posso resolver esse problema?

Eu achei q se separasse as tabelas (policia_militar, estado e regiao), fosse o correto, para não duplicar a regiao. Sendo q há vários estados para uma certa região.

Agradeço pelas explicações...

Oi, Nelma!

O select correto está descrito abaixo, porém vai continuar retornando, em várias linhas, a mesma região para o mesmo estado. O controle, para que apareça somente uma vez, você que vai ter que fazer via programação. O SQL retorna sempre uma tabela (em memória) e neste tipo de relacionamento não há outra forma de resolver.

Se desejar, por não saber como fazer, posso mover este post para a área de PHP (que acho ser a linguagem que você está usando). Lá eles poderão auxiliá-la melhor.

SELECT DISTINCT policia_militar.descricao_pm, policia_militar.url_pm, estado.cod_estado, regiao.cod_regiao, regiao.regiao 
FROM regiao, estado, policia_militar 
WHERE regiao.cod_regiao = estado.cod_regiao AND estado.cod_estado = policia_militar.cod_estado 
ORDER BY regiao.cod_regiao, estado.cod_estado

Link para o comentário
Compartilhar em outros sites

  • 0
Olá Denis!

Obrigada pela ajuda.

Se você puder mover esse post para lá, eu agradeço.

Aliás eu fiz a pergunta lá, mas foi movido para cá.

Obrigada Denis Courcy

Prezados colegas do PHP, por favor ensinem como produzir um relatório master detail, à nossa colega, com base no select corrigido e mencionado acima.

Grato, de antemão

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652,1k
×
×
  • Criar Novo...