Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Vereinigen Sie zwei Tabellen mit Kategorien in einer Abfrage, die Kategorien und ihre Eltern abruft

Erstens unterstützt Ihre MySQL-Version (MariaDB 10.3) allgemeine Tabellenausdrücke, sodass Sie die Verwendung mutierender Variablen in Ihren Abfragen vermeiden können. Das Mutieren von Variablen in einer Abfrage war eine Möglichkeit, hierarchische Abfragen durchzuführen bevor allgemeine Tabellenausdrücke unterstützt wurden, aber es ist eine Taktik, die veraltet ist und für die es keine dokumentierte Garantie gibt, dass sie immer wie beabsichtigt funktioniert.

Hier ist also die Abfrage, um dasselbe mit einem allgemeinen Tabellenausdruck (cte) zu tun, wobei 8 der Beispielwert ist (ersetzen Sie ihn durch den PHP-Ausdruck):

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;

Und jetzt, wenn Sie diese zweite Tabelle haben, können Sie zuerst einen allgemeinen Tabellenausdruck zum Definieren der Vereinigung erstellen und dann wie oben fortfahren:

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;