Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Połącz dwie tabele z kategoriami w zapytaniu, które pobiera kategorie i ich rodziców

Po pierwsze, Twoja wersja MySQL (MariaDB 10.3) obsługuje popularne wyrażenia tabelowe, dzięki czemu możesz uniknąć używania zmiennych mutujących w zapytaniach. Mutowanie zmiennych w zapytaniu jest sposobem wykonywania zapytań hierarchicznych zanim popularne wyrażenia tabelowe były obsługiwane, ale jest to taktyka, która jest przestarzała i dla której nie ma udokumentowanej gwarancji, że zawsze będzie działać zgodnie z przeznaczeniem.

Oto zapytanie, aby zrobić to samo ze wspólnym wyrażeniem tabelowym (cte), gdzie 8 jest wartością przykładową (zastąp ją wyrażeniem 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;

A teraz, gdy masz drugą tabelę, możesz najpierw wykonać wspólne wyrażenie tabelowe do zdefiniowania unii, a następnie kontynuować jak powyżej:

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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. #1062 – Zduplikowany wpis „” dla klucza „unique_id” podczas próby dodania UNIQUE KEY (MySQL)

  2. wyświetlanie dnia poprzez procedurę składowaną

  3. Kiedy wybieramy DateTime zamiast Timestamp?

  4. Co się stanie, jeśli zabiję ogromne zapytanie MySQL InnoDb DELETE?

  5. Jak napisać zapytanie SQL zliczające liczbę wierszy na miesiąc i rok?