Mysql
 sql >> Base de données >  >> RDS >> Mysql

Union de deux tables avec des catégories dans une requête qui récupère les catégories et ses parents

Tout d'abord, votre version de MySQL (MariaDB 10.3) prend en charge les expressions de table courantes, vous avez donc un moyen d'éviter l'utilisation de variables mutantes dans vos requêtes. La mutation de variables dans une requête a été un moyen d'effectuer des requêtes hiérarchiques avant que les expressions de table communes ne soient prises en charge, mais il s'agit d'une tactique obsolète et pour laquelle il n'y a aucune garantie documentée qu'elle fonctionnera toujours comme prévu.

Voici donc la requête pour faire la même chose avec une expression de table commune (cte), où 8 est la valeur d'exemple (remplacez-la par l'expression 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;

Et maintenant, lorsque vous avez cette deuxième table, vous pouvez d'abord créer une expression de table commune pour définir l'union, puis continuer comme ci-dessus :

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;