Ir para conteúdo

Arquivado

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

Lucas Barbosa

PHP + MYSQL Tabela de menu auto relacional

Recommended Posts

Sr.s

 

Estou com uma duvida, fiz um script em PHP para puchar em MYsql o menu do meu site segue:

O scenario é : faço um select na tabela menu e trago todos os menus onde são pais categorias mestre por exemplo o 1 e o 2.

1 .php

1.1 if

1.2 for

 

2 java

1.1 if

1.2 for

se incia um loop onde seleciono com aquele ID os sub menus, fazendo os subgrupos.

Pô resolveu meu problema, mas tenho duas duvidas, se eu tiver 7, 10 submenus, como vou fazer quando o site crescer? e outra estou fazendo varios selects na minha base de dados, isso não arrebenta com o desempenho no meu banco? alguem tem alguma outra opção?

$sql_pai = "select * from menu where parent = 0 ";
$resultado = mysql_query($sql_pai);
while($menu_pai=mysql_fetch_row($resultado)) {
	  echo 	"===="  .  $menu_pai[0] . $menu_pai[1] . $menu_pai[2] . "<br>" ;
	  //filho inic
		$sql_sub = "select * from menu where parent =  ".$menu_pai[0];		
		$resultado_sub = mysql_query($sql_sub);
		//$fetch2 = mysql_fetch_row();
		while($menu_filho=mysql_fetch_row($resultado_sub)) {
		   echo 	"**********"  .  $menu_filho[0] . $menu_filho[1] . $menu_filho[2] . "<br>" ;
			}
		//filho fim
  }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, você precisaria criar 2 tabelas, uma sendo para as CATEGORIAS e outra para as SUB-CATEGORIAS.

 

Ficaria mais ou menos assim:

(TB_CAT)
- ID (int)
- NOME (text)

(TB_SUBCAT)
- ID (int)
- NOME (text)
- CATEGORIA (int)

Onde na coluna CATEGORIA da tabela TB_SUBCAT seria o ID lá da CATEGORIA na tabela TB_CAT. Deu pra entender?

 

Quando você realizar a consulta, você irá fazer uma para as categorias e outras para cada uma das suas sub-categorias de forma recursiva.

 

Algo MAIS OU MENOS assim:

SELECT * FROM tb_cat ORDER BY nome;

SELECT * FROM tb_subcat WHERE categoria = $id;

$id (seria o id da categoria-pai.

 

Acho que deu pra enteder a lógica da coisa né?

 

Boa sorte e qualquer coisa, posta a dúvida aí.

 

Abraços! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas e o fato de ser dinamico? se eu tiver 7 sucategorias, vou precisar fazer 7 tabelas? e se no meio do negocio eu tiver mais uma subcategoria tenho que ficar criando tabelas? isso é meio enviavel né?

 

Na verdade, você precisaria criar 2 tabelas, uma sendo para as CATEGORIAS e outra para as SUB-CATEGORIAS.

 

Ficaria mais ou menos assim:

(TB_CAT)
- ID (int)
- NOME (text)

(TB_SUBCAT)
- ID (int)
- NOME (text)
- CATEGORIA (int)

Onde na coluna CATEGORIA da tabela TB_SUBCAT seria o ID lá da CATEGORIA na tabela TB_CAT. Deu pra entender?

 

Quando você realizar a consulta, você irá fazer uma para as categorias e outras para cada uma das suas sub-categorias de forma recursiva.

 

Algo MAIS OU MENOS assim:

SELECT * FROM tb_cat ORDER BY nome;

SELECT * FROM tb_subcat WHERE categoria = $id;

$id (seria o id da categoria-pai.

 

Acho que deu pra enteder a lógica da coisa né?

 

Boa sorte e qualquer coisa, posta a dúvida aí.

 

Abraços! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas e o fato de ser dinamico? se eu tiver 7 sucategorias, vou precisar fazer 7 tabelas? e se no meio do negocio eu tiver mais uma subcategoria tenho que ficar criando tabelas? isso é meio enviavel né?

 

hehe, o que o Diego sugeriu e você não entendeu é o seguinte:

 

Criando as tabelas

mysql> create table `categorias` (
    ->     `id` mediumint(8) unsigned not null auto_increment,
    ->     `nome` varchar(20) not null,
    ->     primary key(`id`)
    -> ) engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)

mysql> create table `subcategorias` (
    ->     `id` mediumint(8) unsigned not null auto_increment,
    ->     `categoria` mediumint(8) unsigned not null,
    ->     `nome` varchar(20) not null,
    ->     primary key(`id`),
    ->     key `categorias`(`categoria`)
    -> ) engine=MyISAM;
Query OK, 0 rows affected (0.01 sec)

Inserindo alguns dados

mysql> insert into `categorias`(`nome`) values
    ->     ('PHP'),('Java'),('C');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into `subcategorias`(`categoria`,`nome`) values
    ->     (1,'if'),(1,'for'),
    ->     (2,'if'),(2,'for'),
    ->     (3,'if'),(3,'for');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

Agora fazendo a consulta:

mysql> select
    ->     c.`nome` 'categoria',
    ->     s.`nome` 'subcategoria'
    -> from                       
    ->     `categorias` c         
    -> join                       
    ->     `subcategorias` s      
    -> on                         
    ->     s.`categoria` = c.`id`;
+-----------+--------------+
| categoria | subcategoria |
+-----------+--------------+
| PHP       | if           |
| PHP       | for          |
| Java      | if           |
| Java      | for          |
| C         | if           |
| C         | for          |
+-----------+--------------+
6 rows in set (0.06 sec)

Compartilhar este post


Link para o post
Compartilhar em outros sites

e se eu precisar disso:

1. php

1.1 do

1.1.1 dowhile

1.1.2 do

1.1.3 while

1.1.3.1. consideraçoes finais

1.1.3.1.1 teste

 

como você iria inserir????

 

 

Mas e o fato de ser dinamico? se eu tiver 7 sucategorias, vou precisar fazer 7 tabelas? e se no meio do negocio eu tiver mais uma subcategoria tenho que ficar criando tabelas? isso é meio enviavel né?

 

hehe, o que o Diego sugeriu e você não entendeu é o seguinte:

 

Criando as tabelas

mysql> create table `categorias` (
    ->     `id` mediumint(8) unsigned not null auto_increment,
    ->     `nome` varchar(20) not null,
    ->     primary key(`id`)
    -> ) engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)

mysql> create table `subcategorias` (
    ->     `id` mediumint(8) unsigned not null auto_increment,
    ->     `categoria` mediumint(8) unsigned not null,
    ->     `nome` varchar(20) not null,
    ->     primary key(`id`),
    ->     key `categorias`(`categoria`)
    -> ) engine=MyISAM;
Query OK, 0 rows affected (0.01 sec)

Inserindo alguns dados

mysql> insert into `categorias`(`nome`) values
    ->     ('PHP'),('Java'),('C');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into `subcategorias`(`categoria`,`nome`) values
    ->     (1,'if'),(1,'for'),
    ->     (2,'if'),(2,'for'),
    ->     (3,'if'),(3,'for');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

Agora fazendo a consulta:

mysql> select
    ->     c.`nome` 'categoria',
    ->     s.`nome` 'subcategoria'
    -> from                       
    ->     `categorias` c         
    -> join                       
    ->     `subcategorias` s      
    -> on                         
    ->     s.`categoria` = c.`id`;
+-----------+--------------+
| categoria | subcategoria |
+-----------+--------------+
| PHP       | if           |
| PHP       | for          |
| Java      | if           |
| Java      | for          |
| C         | if           |
| C         | for          |
+-----------+--------------+
6 rows in set (0.06 sec)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A explicação do Neto aí deixou tudo bem claro como eu estava te dizendo.

 

Se você está querendo acrescentar umas terceira ou quarta camada, você provavelmente precisará de uma tabela para cada uma das 'camadas (sub-nível)'. Alguém me corrija se eu estiver errado ou souber um jeito melhor de se fazer (nunca fiz esse teste não).

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

e se eu precisar disso:

1. php

1.1 do

1.1.1 dowhile

1.1.2 do

1.1.3 while

1.1.3.1. consideraçoes finais

1.1.3.1.1 teste

 

como você iria inserir????

 

Certo, nesse nível de encadeamento não é tão simples, mas você poderia fazer assim:

 

Criando a tabela

mysql> create table `menu` (
    ->     `id` mediumint(8) unsigned not null auto_increment,
    ->     `super` mediumint(8) unsigned default null,
    ->     `nome` varchar(20),
    ->     primary key(`id`),
    ->     key `super`(`super`)
    -> ) engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)

Com os dados populados ela ficou assim:

mysql> select * from `menu`;
+----+-------+----------------------+
| id | super | nome                 |
+----+-------+----------------------+
| 13 |    12 | default              |
| 12 |     8 | switch               |
| 11 |     9 | else                 |
| 10 |     9 | else if              |
|  9 |     8 | if                   |
|  8 |  NULL | java                 |
|  7 |     6 | teste                |
|  6 |     5 | consideracoes finais |
|  5 |     2 | while                |
|  4 |     2 | do                   |
|  3 |     2 | dowhile              |
|  2 |     1 | do                   |
|  1 |  NULL | php                  |
+----+-------+----------------------+
13 rows in set (0.00 sec)

Agora fazendo o encadeamento:

mysql> select
    ->            m1.`nome` "nivel1",
    ->            m2.`nome` "nivel2",
    ->            m3.`nome` "nivel3",
    ->            m4.`nome` "nivel4",
    ->            m5.`nome` "nivel5"
    -> from      `menu` m1
    -> left join `menu` m2
    -> on         m2.`super` = m1.`id`
    -> left join `menu` m3
    -> on         m3.`super` = m2.`id`
    -> left join `menu` m4
    -> on         m4.`super` = m3.`id`
    -> left join `menu` m5
    -> on         m5.`super` = m4.`id`
    -> where      m1.`super` is null;
+--------+--------+---------+----------------------+--------+
| nivel1 | nivel2 | nivel3  | nivel4               | nivel5 |
+--------+--------+---------+----------------------+--------+
| java   | switch | default | NULL                 | NULL   |
| java   | if     | else    | NULL                 | NULL   |
| java   | if     | else if | NULL                 | NULL   |
| php    | do     | while   | consideracoes finais | teste  |
| php    | do     | do      | NULL                 | NULL   |
| php    | do     | dowhile | NULL                 | NULL   |
+--------+--------+---------+----------------------+--------+
6 rows in set (0.00 sec)

Acho que é isso que você precisa....

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.