Mysql
 sql >> Database >  >> RDS >> Mysql

Unisci due tabelle con categorie in una query che recupera le categorie e i relativi elementi padre

Innanzitutto, la tua versione di MySQL (MariaDB 10.3) supporta espressioni di tabelle comuni, quindi hai un modo per evitare l'uso di variabili mutanti nelle tue query. La mutazione delle variabili in una query è stata un modo per eseguire query gerarchiche prima che le espressioni di tabelle comuni fossero supportate, ma è una tattica che è deprecata e per la quale non esiste alcuna garanzia documentata che funzionerà sempre come previsto.

Quindi ecco la query per fare lo stesso con un'espressione di tabella comune (cte), dove 8 è il valore di esempio (sostituirlo con l'espressione 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 ora, quando hai questa seconda tabella, puoi prima creare un'espressione di tabella comune per definire l'unione, quindi continuare come sopra:

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;