como juntar 1 tabela a (2 tabelas diferentes como uma) em uma árvore de produtos e aplicativos de categorias?

Contador م

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)


editar: esta questão que você sugeriu é sobre construir a árvore de apenas categorias, eu sei como fazer isso. meu problema aqui é que também tenho a tabela "produtos" que deve se juntar à árvore como um nó, assim como a categoria! Quero que as tabelas de categorias e produtos sejam tratadas como uma única tabela (nó)

trincote

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.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo