Ir para conteúdo

Arquivado

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

Diego SM

Auto relacionamento - relacionamento recursivo

Recommended Posts

Ae galera,Possuo uma tabela que tem os seguintes campos:id_categoriaid_paititulogostaria de saber como auto relacionar istopra criar um menu ordenado tipo.possuindo os dados...1 0 secao 012 0 secao 023 0 secao 034 1 subsecao do 015 2 subsecao do 02gostaria de saber como fazer o sql retornar algo tiposecao 01- subsecao do 01secao 02- subsecao do 02seaco 03pra fazer com que o menu possa ter submenus ilimitados...valeu ae galera

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa,

 

Beleza camarada!! Seguinte...seu modelo tá legal. . .agora, para você incrementar da menira como representou nos seu post, com auto_increment você não vai conseguir, pois o próximo registro sempre será o identificador atual + 1.

 

Bom, você pode incrementar o submenu_id com uma trigger que recebe o valor do insert, pega o valor da categoria (NEW.categoria), checa o maior valor do id submenu para esta categoria na tabela submenu, incrementa e grava o novo registro...ou mesmo, um Stored Procedure ou Function.

 

Com este recursos você conseguirá montar essa hierarquia.

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego,

 

Para o seu problema utilize o SQL abaixo, ja que no MySQL nao tem a opcao de CONNECT BY como no Oracle

 

MySQL:

 

select tp.id_categoria Pai,

t.id_categoria,

t.id_pai PFilho,

tp.descricao,

t.descricao

from cliente_prodcat t, cliente_prodcat tp

where t.id_pai in (select ttp.id_categoria

from cliente_prodcat ttp

where ttp.id_pai = 0)

and t.id_pai = tp.id_categoria

or (tp.id_pai = 0 and tp.id_categoria = t.id_categoria)

order by 4, 2

 

 

Oracle:

select t.id_pai PFilho,

t.id_categoria,

t.descricao

from cliente_prodcat t

connect by t.id_categoria = t.id_pai;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom eu tenho algo parecido, mas gostaria de ir um pouco além!

 

Eu tenho categorias

 

-PK

-Nome

-PARENT

 

e tenho minhas categorias nessa árvore

 

*Confeções

**Camisetas

***Camistas Masculinas

***Camisetas Femininas

**Agasalhos

***Camistas Masculinas

***Camisetas Femininas

*Calçados

**Trakin

**Chuteiras

***Com travas

***Sem travas

 

 

Dessa maneira, gostaria de trazer dessa mesma forma que apresentei a vocês os resultados, repetindo o "*" de acordo com sua posição, na árvore.

 

Tenho olhado vários casos, e achei coisas bem, complexas, mas em MsSQL ficou fácil de fazer utilizando um "WITH" mas em MySQL que é o banco que estou utilizando hoje, não consegui fazer essa opção

 

 

Vi algumas coisas como

 

CREATE TABLE nested_category (

category_id INT AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(20) NOT NULL,

lft INT NOT NULL,

rgt INT NOT NULL

);

 

 

INSERT INTO nested_category

VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4),

(4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),

(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13),

(9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18);

 

 

LOCK TABLE nested_category WRITE;

SELECT @myRight := rgt FROM nested_category

WHERE name = 'TELEVISIONS';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;

UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2);

UNLOCK TABLES;

 

 

SELECT CONCAT( REPEAT( '-', (COUNT(parent.name) - 1) ), node.name) AS name

FROM nested_category AS node,

nested_category AS parent

WHERE node.lft BETWEEN parent.lft AND parent.rgt

GROUP BY node.name

ORDER BY node.lft;

 

 

+-----------------------+

| name |

+-----------------------+

|-ELECTRONICS |

|--TELEVISIONS |

|---TUBE |

|---LCD |

|---PLASMA |

|--GAME CONSOLES |

|--PORTABLE ELECTRONICS |

|---MP3 PLAYERS |

|----FLASH |

|---CD PLAYERS |

|---2 WAY RADIOS |

+-----------------------+

 

 

Utilizando a árvore:

Imagem Postada

 

 

Imagem Postada

 

 

 

Entretanto eu não sei os níveis que posso chegar, então não tenho como inserir numa tabela os níveis utilizando "bordas", como no exemplo acima,

Alguém sabe como resolver esse probleminha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tive o mesmo problema e a solução foi mesmo no pau, função recursiva em php.

 

No meu caso trata-se de células com linhas ou colunas (cada linha ou coluna é uma nova célula que por sua vez pode ter linhas ou colunas....

 

CREATE TABLE `forms_cells` (

`formulario` int(11) unsigned NOT NULL,

`celula` bigint(20) unsigned NOT NULL,

`precedente` int(20) unsigned NOT NULL default '0',

`linha` int(5) unsigned NOT NULL default '0',

`coluna` int(5) unsigned NOT NULL default '0',

`th` int(3) unsigned NOT NULL default '0',

`tv` int(3) unsigned NOT NULL default '0',

`oh` smallint(1) unsigned NOT NULL default '0',

`ov` smallint(1) unsigned NOT NULL default '0',

`tcell` smallint(3) unsigned NOT NULL default '0',

PRIMARY KEY (`formulario`,`celula`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

 

INSERT INTO `forms_cells` VALUES (1, 1, 0, 0, 0, 1200, 720, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (1, 2, 1, 0, 1, 10, 720, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (1, 3, 1, 0, 2, 1180, 720, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (1, 4, 1, 0, 3, 10, 720, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (1, 5, 3, 1, 0, 1180, 10, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (1, 6, 3, 2, 0, 1180, 700, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (1, 7, 3, 3, 0, 1180, 10, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (1, 8, 6, 1, 0, 1180, 30, 1, 1, 1);

INSERT INTO `forms_cells` VALUES (1, 9, 6, 2, 0, 1180, 10, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (1, 10, 6, 3, 0, 1180, 600, 0, 1, 5);

INSERT INTO `forms_cells` VALUES (1, 11, 6, 4, 0, 1180, 10, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (1, 12, 6, 5, 0, 1180, 50, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 1, 0, 0, 0, 1200, 720, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (2, 2, 1, 0, 1, 10, 720, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (2, 3, 1, 0, 2, 1180, 720, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (2, 4, 1, 0, 3, 10, 720, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (2, 5, 3, 1, 0, 1180, 10, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (2, 6, 3, 2, 0, 1180, 700, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (2, 7, 3, 3, 0, 1180, 10, 0, 0, 0);

INSERT INTO `forms_cells` VALUES (2, 8, 6, 1, 0, 1180, 30, 1, 1, 1);

INSERT INTO `forms_cells` VALUES (2, 9, 6, 2, 0, 1180, 5, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 10, 6, 3, 0, 1180, 170, 0, 1, 3);

INSERT INTO `forms_cells` VALUES (2, 19, 12, 0, 1, 95, 20, 2, 1, 1);

INSERT INTO `forms_cells` VALUES (2, 11, 10, 0, 1, 580, 170, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 12, 11, 1, 0, 580, 20, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 13, 11, 2, 0, 580, 5, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 14, 11, 3, 0, 580, 20, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 15, 11, 4, 0, 580, 5, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 16, 11, 5, 0, 580, 20, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 17, 11, 6, 0, 580, 80, 0, 1, 0);

INSERT INTO `forms_cells` VALUES (2, 18, 11, 7, 0, 580, 20, 0, 1, 0);

 

O problema é que está ficando um pouco pesado. É normal uma form como o da imagem seguinte ter 150 células e se multiplicar por... 1000 formulários tenho 150.000 células

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.