Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marcelo2605

[Resolvido] Pesquisa complexa para menu

Recommended Posts

Pessoal, um menu com a seguinte estrutura

 

Ano

Item

Conteúdo

 

Para isso, criei 3 tabelas:

 

ANO: id_ano, ano

 

ITEM: id_item, id_ano, item

 

CONTEUDO: id_conteudo, id_item, conteudo

 

O problema é que não estou conseguindo relacionar as tabelas. Minha única tentativa com (quase) sucesso, mostrou apenas um item para cada ano:

 

SELECT ano.ano, item.item 
FROM ano 
INNER JOIN item 
ON ano.id_ano = item.id_ano 
GROUP BY ano.ano 
ORDER BY ano.ano DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia amigo,

 

Acho que isso resolve:

 

SELECT a.ano, i.item
FROM item i
JOIN ano a ON a.id_ano = i.id_ano

Ou simplesmente tirar o GROUP BY do teu primeiro SQL.

 

A disposição, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, bom dia

 

Da forma como você passou, o menu repete o ano para cada item:

 

2012

item 1

2012

item 2

2011

item 3

2011

item 4

 

O que eu preciso é:

 

2012

item 1

item 2

2011

item 3

item 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dessa forma somente via aplicação, você não pode fazer este tipo de retorno pelo banco pois veja, pra cada item será retornada uma linha, e nesta linha vai conter o ano.

 

O que você está querendo é montar cabeçalho (ano) e detalhes (itens). Isso somente via aplicação.

 

Ou usando um GROUP_CONCAT para trazer todos os itens de 1 ano na mesma linha. Tente essa instrução:

 

SELECT a.ano, GROUP_CONCAT(i.item)
FROM item i
JOIN ano a ON a.id_ano = i.id_ano
GROUP BY a.ano

Veja se isto te atende, acho que é o máximo que dá de fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, consegui unir os itens dentro do mesmo ano, mas eles ficaram separados por vírgula, dentro da mesma LI.

 

Eu preciso que eles fiquem em LIs separadas, pois cada item tem um link específico. isso só é possível com php?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, bom dia

 

Da forma como você passou, o menu repete o ano para cada item:

 

2012

item 1

2012

item 2

2011

item 3

2011

item 4

 

O que eu preciso é:

 

2012

item 1

item 2

2011

item 3

item 4

 

cara aqui e pq você tem que criar uma regra em modo de execulção

 

quando você começa a exibir no while você faz assim

while($Mst = mysql_fetch_array($Qry)){
if($DifAno <> $Mst['ano']){
 echo $Mst['ano']
}

echo $Mst['item'];


//no fim do laço você coloca;
$DifAno = $Mst['ano'];
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, consegui unir os itens dentro do mesmo ano, mas eles ficaram separados por vírgula, dentro da mesma LI.

 

Eu preciso que eles fiquem em LIs separadas, pois cada item tem um link específico. isso só é possível com php?

Sim amigo, essa estrutura que você quer é como eu disse uma estrutura de cabeçalho e "filhos".

 

O ano é o cabeçalho e os itens os filhos. No banco não podemos retornar desta maneira pois cada linha terá o ano, então você precisa fazer via PHP mesmo. O GROUP_CONCAT é assim mesmo ele agrupa e separa por vírgula.

 

O que você pode fazer no PHP?

 

Pegar a coluna do ano e imprimir na tela onde deseja, aí pegar a coluna dos itens, usar alguma das várias funções PHP pra dividi-la em um array, fazer um looping pra escrever os elementos do array.

 

Se tiver dúvidas ou quiser ajuda é só postar, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Erison, o meu while está um pouco diferente, veja:

 

<ul>
<?php do { ?>
<li><span><?php echo $row_rsMenu['ano']; ?></span>
<ul>
<li><span><?php echo $row_rsMenu['item']; ?></span></li>
</ul>
</li>
<?php } while ($row_rsMenu = mysql_fetch_assoc($rsMenu)); ?>
</ul>

 

Diego, posso usar explode() para separar a string em arrays, mas como colocar cada array dentro de uma <li>?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cada elemento do array você quis dizer né?

 

Da mesma forma que tu faz acima, só que com os elementos do array. Percorra o array usando for ou foreach eu acho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Erison, o meu while está um pouco diferente, veja:

 

<ul>
<?php do { ?>
<li><span><?php echo $row_rsMenu['ano']; ?></span>
<ul>
<li><span><?php echo $row_rsMenu['item']; ?></span></li>
</ul>
</li>
<?php } while ($row_rsMenu = mysql_fetch_assoc($rsMenu)); ?>
</ul>

 

Diego, posso usar explode() para separar a string em arrays, mas como colocar cada array dentro de uma <li>?

 

cara eu não entedie esse teu while acho que era para ser assim

 

 

<ul>
<?php
$rsMenu = mysql_query('SELECT a.ano, i.item,count(*) as qtd FROM item i JOIN ano a ON a.id_ano = i.id_ano');
$i = 0;
while ($row_rsMenu = mysql_fetch_assoc($rsMenu)){ ?>
<?php  if($DifAno <> $row_rsMenu['ano']){?>
<li><span><?php echo $row_rsMenu['ano']; ?></span>
<?php }?>

<ul>
<li><span><?php echo $row_rsMenu['item']; ?></span></li>
</ul>

<?php if($i==$row_rsMenu['qtd']){ $i=1;?>
</li>
<?php
}


$DifAno = $row_rsMenu['ano'];
$i++;
} ?>
</ul>

 

ai você ja ajusta a identação do codigo pq ta meio bagunçado :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você vai ter que deixar mais ou menos assim:

 

$query = "SELECT a.ano AS ano, GROUP_CONCAT(i.item) AS itens FROM item i JOIN ano a ON a.id_ano = i.id_ano GROUP BY a.ano";

$result = mysql_query($query);

while($menu = mysql_fetch_array($result)){
   echo $menu["ano"];

   $itens = explode(",", $menu["itens"]);

   foreach($itens as $item){
       echo $item;
   }
}

Acho que seria isso, aí dentro dos echos você pode colocar os <li>, ou qualquer formatação que desejar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, da forma que você me passou deu certo.

 

Uma dúvida: eu preciso pegar também o id do item. Então fiz o seguinte:

 

SELECT ano.ano, GROUP_CONCAT(item.item) as titulos, GROUP_CONCAT(item.id_item) as links FROM ano JOIN item ON ano.id_ano = item.id_ano GROUP BY ano.ano ORDER BY ano.ano DESC

 

O resultado foi uma string dos dois IDs dentro de cada ano (1,2). É possível usar o for each para duas strings diferentes?

 

Erison, obrigado. O while no final é padrão do DW. Vou tentar seu script.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que você pode usar o foreach pra deixar o ID como key do array e o item como value. Veja no manual desse comando do PHP.

 

Acho que é isso que tu quer não entendi muito bem, mas qualquer coisa posta aí que vamos vendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, acho que consegui. Veja como ficou:

 

<?php 
$titulos = explode(",", $row_rsMenu['titulos']);
$links = explode(",", $row_rsMenu['links']); 
foreach(array_combine($links, $titulos) as $link => $titulo){ 
?>
<li><span><a href="works.php?id=<?php echo $link; ?>"><?php echo $titulo; ?></a></span></li>
<?php } ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não lembrava dessa array_combine, muito bom.

 

Ainda bem então :D Qualquer coisa que precisar estamos aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.