Jump to content


Photo

Agrupamento De Dados


  • Faça o login para participar
9 replies to this topic

#1 Red FeniX

Red FeniX

    Novato no fórum

  • Usuários
  • 24 posts
  • Sexo:Não informado

Posted 21/04/2009, 00:55

Olá,

Tenho uma tabela de categorias organizada da seguinte maneira:

idCat | nome_cat | id_pai


Onde:

idCat - id da categoria
nome_cat - nome da categoria
id_pai - id ao qual aquela sub-categoria se submete (se for uma categoria preenche-se com 0)

O que quero fazer é exibir assim:

|-CATEGORIA X
|--Sub-categoria 1x
|--Sub-categoria 2x
|--Sub-categoria 3x


|-CATEGORIA Y
|--Sub-categoria 1y
|--Sub-categoria 2y
|--Sub-categoria 3y


Como fazer?

Abraços

#2 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 21/04/2009, 01:28

faça uma query que puxe direto do BD as categorias
+/- isso:
ae isso embaixo do titulo da categoria pai...
$sql = mysql_query("select * from cat order by ID desc");
while($row=mysql_fetch_array($sql)){
echo"{$row['Categorias']} <br />";
}

Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#3 Red FeniX

Red FeniX

    Novato no fórum

  • Usuários
  • 24 posts
  • Sexo:Não informado

Posted 21/04/2009, 10:46

Esse problema eu resolvi fazendo dois whiles assim:

$sql = mysql_query("SELECT * FROM $tablecats WHERE id_pai='0' ORDER BY idCat ASC") or die(mysql_error());
		
		$lastID = ""; 
		
		while($a = mysql_fetch_array($sql)) {
			
			
			echo 'CATEGORIA';
		
		$lastID = $a["idCat"];	
		
		$sub = mysql_query("SELECT * FROM $tablecats WHERE id_pai='$lastID' ORDER BY idCat ASC") or die(mysql_error());
		
		while($r = mysql_fetch_array($sub)) {

Mas como eu fao para exibir mais de uma subcategoria assim:

|-CATEGORIA X
|--Sub-categoria 1x
|---Sub-categoria 1.1x
|----Sub-categoria 1.1.1x


Abraços

#4 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 21/04/2009, 12:44

Uma idéia, seria por exemplo, vc tem o menu:

Main
Inicio
Forum
Sobre

para exibir as sub categorias do sobre, vc pode armazenar o conteudo em uma variavel, e quando clicado vc faz aparecer usando um poco de JS

ou então, vc pode usar mais campos dentro da tabela e ir fazendo os niveis usando um BD Relacional
Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#5 Red FeniX

Red FeniX

    Novato no fórum

  • Usuários
  • 24 posts
  • Sexo:Não informado

Posted 21/04/2009, 13:23

Nem é preciso isso.

Eu sei que dá pra se fazer apenas com os três campos que eu tenho na tabela. O problema é que eu não sei como eu faço para exibir os dados da maneira que eu disse.

|-CATEGORIA X
|--Sub-categoria 1x
|---Sub-categoria 1.1x
|----Sub-categoria 1.1.1x


Saco?

#6 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 21/04/2009, 13:34

Ahhhh
agora acho que saquei

Por exemplo
|-Produtos
|---Hardware
|-----Monitores

isso né?

é só fazer a mesma coisa...

por exemplo, vc tem isso:
$sql = mysql_query("SELECT * FROM $tablecats WHERE id_pai='0' ORDER BY idCat ASC") or die(mysql_error());
		
		$lastID = "";
		
		while($a = mysql_fetch_array($sql)) {
			
			
			echo 'CATEGORIA';
		
		$lastID = $a["idCat"];	
		
		$sub = mysql_query("SELECT * FROM $tablecats WHERE id_pai='$lastID' ORDER BY idCat ASC") or die(mysql_error());
		
		while($r = mysql_fetch_array($sub)) {
}

Não fiz o teste aqui, mas se vc usar mais uma query, vc pode montar isso...
mandando ele exibir as sub categorias assim como foi feito para mostrar categoria pai e as categorias dentro dela

apenas como adendo, se quiser identar pode usar um for() contando quantas categorias tem e adicionando um - para cada ;D
Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#7 Red FeniX

Red FeniX

    Novato no fórum

  • Usuários
  • 24 posts
  • Sexo:Não informado

Posted 21/04/2009, 13:42

Hmm, acho que entendi...

Vo testar mais tarde e digo se deu certo.

vlw

#8 CMAC

CMAC

    Normal

  • Usuários
  • 93 posts
  • Sexo:Masculino

Posted 21/04/2009, 18:12

Você pode usar JOIN's na query para obter todas as categorias e subcategorias.

Por exemplo, se sua tabela se chama cat e o nível de subcategorias é 2 (é possível ter categoria, subcategoria e "subsubcategoria"), então você tem que usar dois JOIN's na query:
SELECT `c1`.`nome_cat` AS `n1` , `c2`.`nome_cat` AS `n2` , `c3`.`nome_cat` AS `n3`
FROM `cat` AS `c1`
LEFT JOIN `cat` AS `c2` ON `c1`.`idCat` = `c2`.`id_pai`
LEFT JOIN `cat` AS `c3` ON `c2`.`idCat` = `c3`.`id_pai`
WHERE `c1`.`id_pai` = 0

Agora com o PHP você trata os resultados da maneira que quiser.
Supondo que o array de objectos contendo o resultado da query mostrada acima é definido na variável $result, você pode imprimir a lista de categorias no formato:
Cat 1
--Sub Cat 1.1
----Sub Cat 1.1.1
----Sub Cat 1.1.2
----Sub Cat 1.1.3
--Sub Cat 1.2
--Sub Cat 1.3
--Sub Cat 1.4
--Sub Cat 1.5
Cat 2
--Sub Cat 2.1
--Sub Cat 2.2
Cat 3

usando o seguinte código:
$cat = '';
$subcat = '';
foreach($result as $row)
{
	if($cat == $row->n1 AND $row->n2 != NULL)
	{
		if($subcat == $row->n2 AND $row->n3 != NULL)
		{
			print_cat($row->n3, 2);
		}
		elseif($subcat != $row->n2)
		{
			$subcat = $row->n2;
			print_cat($row->n2, 1);
			if($row->n3 != NULL)
				print_cat($row->n3, 2);
		}
	}
	elseif($cat != $row->n1)
	{
		$cat = $row->n1;
		$subcat = '';
		print_cat($cat, 0);
		if($row->n2 != NULL)
		{
			$subcat = $row->n2;
			print_cat($subcat, 1);
			if($row->n3 != NULL)
				print_cat($row->n3, 2);
		}
	}
}

em que print_cat é:
function print_cat($name, $level)
{
	for($i = 0; $i < $level; $i++)
		echo '-';
	
	echo $name . '<br />';
}

Deu para entender algo!?

Note que o código acima ainda pode ser melhorado. Esta foi uma solução rápida de resolver o problema.

Abraços

#9 Red FeniX

Red FeniX

    Novato no fórum

  • Usuários
  • 24 posts
  • Sexo:Não informado

Posted 21/04/2009, 19:24

Hmmm

A lógica é bacana, mas como não sou muito bom com SQL, o que seria o c1, c2, c3 etc?

Lembrando que a inserção de dados é dinâmica, ou seja, o usuário cria quantos níveis ele quiser saca?

Mas vlew parceiro, clareou um bocado a minha mente.

#10 CMAC

CMAC

    Normal

  • Usuários
  • 93 posts
  • Sexo:Masculino

Posted 22/04/2009, 13:14

A lógica é bacana, mas como não sou muito bom com SQL, o que seria o c1, c2, c3 etc?


São aliases da tabela categorias. Para saber mais procure por "SQL Alias".

Lembrando que a inserção de dados é dinâmica, ou seja, o usuário cria quantos níveis ele quiser saca?


Como disse, isto aplica-se quando você sabe o número de níveis. Para cada nível a mais deve usar um JOIN. Porém, a performance é muito melhor do que ter várias queries.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq