Estou fazendo uma árvore de produtos e categorias. a árvore aceita que os produtos existam em qualquer categoria, seja um nó pai ou uma folha.
aqui estão minhas mesas
#category table
+------+-----------+-------------+
| ID | cat_name | parent_cat |
+------+-----------+-------------+
| 1 | TV | NULL |
+------+-----------+-------------+
| 2 | LCD | 1 |
+------+-----------+-------------+
| 3 | PLASMA | 1 |
+------+-----------+-------------+
#product table
+------+-----------+-----------+
| ID | prd_name | prd_cat |
+------+-----------+-----------+
| 1 | LG | 1 |
+------+-----------+-----------+
| 2 | HD | 2 |
+------+-----------+-----------+
| 3 | FHD | 2 |
+------+-----------+-----------+
o que eu quero é fazer uma consulta selecionada para recuperar a árvore completa contendo todas as categorias e produtos.
Posso recuperar as categorias com esta consulta
select cat1.cat_name lvl1, cat2.cat_name lvl2
from category cat1 left join category cat2 on cat1.ID = cat2.parent_cat
where cat1.parent_cat is null;
isso me dá algo assim
+------+------+
| lvl1 | lvl2 |
+------+------+
| TV | LCD |
+------+------+
| TV |PLASMA|
+------+------+
quando tentei juntar os produtos na árvore usei esta consulta
select cat1.cat_name,cat2.cat_name,product.prd_name
from category cat1 left join category cat2 on cat1.ID = cat2.parent_cat
left join product on cat1.ID = product.prd_cat
where cat1.parent_cat is null;
mas aquele sql me dá esse resultado
+-----------+-----------+-----------+
| cat_name | cat_name | prd_name |
+-----------+-----------+-----------+
| TV | LCD | LG |
+-----------+-----------+-----------+
| TV | PLASMA | LG |
+-----------+-----------+-----------+
Quero que a tabela de produtos seja tratada como a tabela de categoria (nível 2), portanto, se um nó pai como TV tiver algumas categorias filho e produtos filho, eu tenho os dois. Como obter uma árvore de resultados como esta:
+-------------+------------+------------+
| tree_lvl_1 | tree_lvl_2 | tree_lvl_3 |
+-------------+------------+------------+
| TV | LG | NULL |
+-------------+------------+------------+
| TV | LCD | HD |
+-------------+------------+------------+
| TV | LCD | FHD |
+-------------+------------+------------+
| TV | PLASMA | NULL |
+-------------+------------+------------+
TV (categoria)> LG (produto)
TV (categoria)> LCD (categoria)> HD (produto)
TV (categoria)> LCD (categoria)> FHD (produto)
TV (categoria)> PLASMA (categoria)
Você pode resolver isso removendo primeiro a complexidade de ter duas tabelas. Crie uma visualização que combine registros de categoria com registros de produto, como este:
create view combi as
select 'P' as type,
id,
prd_name as name,
prd_cat as parent_id
from product
union all
select 'C' as type,
id,
cat_name,
parent_cat
from category;
Agora você pode fazer a consulta com base nesta visualização, certificando-se de adicionar o requisito de tipo na condição de junção:
select lvl1.name as lvl1,
lvl2.name as lvl2,
lvl3.name as lvl3
from combi as lvl1
left join combi as lvl2 on lvl1.id = lvl2.parent_id and lvl1.type = 'C'
left join combi as lvl3 on lvl2.id = lvl3.parent_id and lvl2.type = 'C'
where lvl1.parent_id is null;
Veja-o rodar em SQLFiddle :
| lvl1 | lvl2 | lvl3 |
|------|--------|--------|
| TV | LCD | HD |
| TV | LCD | FHD |
| TV | LG | (null) |
| TV | PLASMA | (null) |
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras