regina 0 Denunciar post Postado Setembro 23, 2009 Oi pessoal! Estou em dúvida na exibição de diretores e cargos, tenho as seguintes tabelas: Em uma tabela eu tenho as diretorias e seus mandatos, em outra eu tenhos os diretores. Preciso exibir todos os diretores de uma diretoria depois todos os da outra diretoria, e assim por diante. -- -- Estrutura da tabela `tb_diretorias` -- CREATE TABLE `tb_diretorias` ( `diretoria_id` int(2) NOT NULL auto_increment, `diretoria` varchar(50) NOT NULL, `mandato` varchar(50) NOT NULL, `status` enum('ativo','inativo') NOT NULL, `criacao_data` datetime NOT NULL, `criacao_ope` int(2) NOT NULL, `edicao_data` datetime NOT NULL, `edicao_ope` int(2) NOT NULL, PRIMARY KEY (`diretoria_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; -- -------------------------------------------------------- -- -- Estrutura da tabela `tb_diretoria_membros` -- CREATE TABLE `tb_diretoria_membros` ( `diretoria_membro_id` int(2) NOT NULL auto_increment, `diretoria_id` int(11) NOT NULL, `cargo` varchar(50) NOT NULL, `diretor` varchar(50) NOT NULL, `status` enum('ativo','inativo') NOT NULL, `criacao_data` datetime NOT NULL, `criacao_ope` int(2) NOT NULL, `edicao_data` datetime NOT NULL, `edicao_ope` int(2) NOT NULL, PRIMARY KEY (`diretoria_membro_id`,`diretoria_id`), KEY `i1` (`diretoria_membro_id`), KEY `i2` (`diretoria_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ; Para exibir estou usando o seguinte script: $sql=mysql_query("SELECT * FROM tb_diretorias INNER JOIN tb_diretoria_membros ON(tb_diretorias.diretoria_id=tb_diretoria_membros.diretoria_id) WHERE tb_diretorias.status='ativo' GROUP BY tb_diretorias.diretoria_id ORDER BY tb_diretorias.diretoria_id ASC") or die (mysql_error()); ?> <dl> <?php while($aux=mysql_fetch_array($sql)){ ?> <dt class="diretoria"><?php print $aux["cargo"]; ?></dt> <dd class="diretoria"><?php print $aux["diretor"]; ?></dd> <?php }?> </dl> Agradeço a quem puder ajudar. Compartilhar este post Link para o post Compartilhar em outros sites
Eclesiastes 2 Denunciar post Postado Setembro 23, 2009 Pelo que vejo, você não precisa da parte "GROUP BY tb_diretorias.diretoria_id" na sua query. E o seu problema parece ser apenas com exibição dos dados, correto? Você quer montar algo destacando cada diretoria? Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 24, 2009 Preciso exibir todos os diretores de uma diretoria depois todos os da outra diretoria, e assim por diante. Não conheço outra forma, senão fazer 2 loops encaixados:o externo busca todas as diretorias, e passa um parâmetro para um loop interno listar os diretores dessa diretoria. Compartilhar este post Link para o post Compartilhar em outros sites
regina 0 Denunciar post Postado Setembro 24, 2009 Pelo que vejo, você não precisa da parte "GROUP BY tb_diretorias.diretoria_id" na sua query. E o seu problema parece ser apenas com exibição dos dados, correto? Você quer montar algo destacando cada diretoria? Exato Diretoria tal presidente fulano de tal vicê-presidente ciclano e assim por diante Compartilhar este post Link para o post Compartilhar em outros sites
Eclesiastes 2 Denunciar post Postado Setembro 24, 2009 Isso você controla na exibição com uma variável auxiliar, algo como: <?php /* ... */ $sql=mysql_query(" SELECT tb_diretorias.diretoria, tb_diretoria_membros.cargo, tb_diretoria_membros.diretor FROM tb_diretorias INNER JOIN tb_diretoria_membros ON tb_diretoria_membros.diretoria_id = tb_diretorias.diretoria_id WHERE tb_diretorias.status = 'ativo' ") or die (mysql_error()); $last_diretoria = NULL; while($aux=mysql_fetch_array($sql)){ /* Quando mudar a diretoria, coloca o nome da mesma como título */ if ($last_diretoria != $aux['diretoria']) { /* Se não for a primeira, fecha o <dl> */ if (!is_null($last_diretoria)) { print '</dl>'; } print '<h2>'. $aux['diretoria'] .'</h2>'; print '<dl>'; } ?> <dt class="diretoria"><?php print $aux["cargo"]; ?></dt> <dd class="diretoria"><?php print $aux["diretor"]; ?></dd> <?php $last_diretorio = $aux['diretoria']; } ?> </dl> E de uma forma mais limpa, embora fazendo em dois processo, seria coletar separando em um array com a diretoria na chave, e então imprimindo num foreach. A montagem seria como: $diretorias = array(); while($aux=mysql_fetch_array($sql)){ $diretorias[$aux['diretoria']][] = array($aux['cargo'], $aux['diretor']); } O resto no foreach ficaria bem limpo, sem esses ifs que eu coloquei no primeiro exemplo. Compartilhar este post Link para o post Compartilhar em outros sites
regina 0 Denunciar post Postado Setembro 24, 2009 E de uma forma mais limpa, embora fazendo em dois processo, seria coletar separando em um array com a diretoria na chave, e então imprimindo num foreach. A montagem seria como: $diretorias = array(); while($aux=mysql_fetch_array($sql)){ $diretorias[$aux['diretoria']][] = array($aux['cargo'], $aux['diretor']); } O resto no foreach ficaria bem limpo, sem esses ifs que eu coloquei no primeiro exemplo. Muito Obrigada Eclesiastes, funcionou da maneira que precisava. Mas... Como seria usando o foreach? Uma curiosidade: Vi que você usa aspas simples, existe diferença em processamento ou é mais correta seu uso ao das aspas duplas? Novamente muito obrigada! Compartilhar este post Link para o post Compartilhar em outros sites
Eclesiastes 2 Denunciar post Postado Setembro 24, 2009 De nada. :) Com foreach, seria assim: $diretorias = array(); while ($aux = mysql_fetch_array($sql)) { $diretorias[$aux['diretoria']][] = array($aux['cargo'], $aux['diretor']); } foreach ($diretorias as $titulo => $diretores) { print '<h2>'. $titulo .'</h2>'; print '<dl>'; foreach ($diretores as $info) { print '<dt class="diretoria">'. $info[0] .'</dt>'; print '<dd class="diretoria">'. $info[1] .'</dd>'; } print '</dl>'; } Eu tenho o costume de usar aspas simples mesmo, em geral não faz muita diferença, mas há sim um diferente processamento do seu conteúdo. Como em aspas duplas pode haver a interpolação (o aparecimento do valor real das variáveis na string). Compartilhar este post Link para o post Compartilhar em outros sites