sql >> Base de Datos >  >> RDS >> Mysql

Unión de dos tablas con categorías en una consulta que recupera categorías y sus padres

Primero, su versión de MySQL (MariaDB 10.3) admite expresiones de tabla comunes, por lo que tiene una forma de evitar el uso de variables mutantes en sus consultas. Mutar variables en una consulta ha sido una forma de realizar consultas jerárquicas antes de que se admitieran las expresiones de tabla comunes, pero es una táctica obsoleta y para la cual no hay garantía documentada de que siempre funcionará según lo previsto.

Así que aquí está la consulta para hacer lo mismo con una expresión de tabla común (cte), donde 8 es el valor de ejemplo (reemplácelo con la expresión de 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;

Y ahora, cuando tenga esta segunda tabla, primero puede hacer una expresión de tabla común para definir la unión y luego continuar como arriba:

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;