Diego SM 0 Report post Posted October 19, 2007 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 Share this post Link to post Share on other sites
Wagner Bianchi 0 Report post Posted October 19, 2007 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 Share this post Link to post Share on other sites
David Silveira 0 Report post Posted October 29, 2007 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; Share this post Link to post Share on other sites
Roberto F. 0 Report post Posted August 20, 2009 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: 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? Share this post Link to post Share on other sites
DCD 1 Report post Posted August 23, 2009 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 Share this post Link to post Share on other sites