Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

União de duas tabelas com categorias em uma consulta que recupera categorias e seus pais


Primeiro, sua versão do MySQL (MariaDB 10.3) suporta expressões de tabela comuns, então você tem uma maneira de evitar o uso de variáveis ​​mutantes em suas consultas. Mudar variáveis ​​em uma consulta tem sido uma forma de realizar consultas hierárquicas antes que as expressões de tabela comuns fossem suportadas, mas é uma tática que está obsoleta e para a qual não há garantia documentada de que sempre funcionará conforme o esperado.

Então aqui está a consulta para fazer o mesmo com uma expressão de tabela comum (cte), onde 8 é o valor de exemplo (substitua-o pela expressão PHP):
with recursive 
cte as (
    select 1 as categoryDepth,
           c.* 
    from   tbl_categories c
    where  categoryId = 8
    union
    select cte.categoryDepth + 1, 
           c.*
    from   cte
    inner join tbl_categories c
            on c.categoryId = cte.categoryParentId
)
select   * 
from     cte
order by categoryDepth desc;

E agora, quando você tem esta segunda tabela, você pode primeiro fazer uma expressão de tabela comum para definir a união e depois continuar como acima:
with recursive 
base as (
    select * from tbl_categories
    union
    select * from tbl_categories_custom
),
cte as (
    select 1 as categoryDepth,
           base.* 
    from   base
    where  categoryId = 8
    union
    select cte.categoryDepth + 1, 
           base.*
    from   cte
    inner join base
            on base.categoryId = cte.categoryParentId
)
select   *
from     cte
order by categoryDepth desc;