Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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;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:
/applications/core/interface/imageproxy/imageproxy.php?img=http://dev.mysql.com/tech-resources/articles/hierarchical-data-4.png&key=db3bef94cdb42ee7a7121c1bd4f2b8687f5d897627c6515d86a369e10859e1b2" alt="Imagem Postada" />
/applications/core/interface/imageproxy/imageproxy.php?img=http://dev.mysql.com/tech-resources/articles/hierarchical-data-3.png&key=3ed58f8c7f20613b022ed1f1b64c8a03b607ac81ec779cb8cdbcef23c82291bc" alt="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?
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
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