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

Mysql-forespørgsel, som returnerer kategoritræ

Der er ingen enkelt SQL-forespørgsel som kan give dig resultater, som du forventer, baseret på denne tabelstruktur.

Der er to måder at løse problemet på:

  1. Brug ekstern applikationslogik (uden for DB) til at foretage rekursive opkald, der vil opdage børn af hver kategori og bygge træet i applikationen.

  2. Brug en af ​​algoritmerne til lagring af trædata i en relationsdatabase. En af sådanne algoritmer kaldes Ændret Preorder Tree Traversal eller blot MPTT.

Forudsat at vi bruger kolonner lft og rgt for at vedligeholde venstre/højre indekser på tværs, når du indsætter en ny kategori, skal du:

  1. Få oplysninger om overordnet kategori efter Id:SELECT lft,rgt FROM tbl_categories WHERE categoryId=5 Lad os for et eksempel antage, at den overordnede kategori havde lft=7 og rgt=10 (i dette tilfælde har den allerede ét barn)

  2. Giv plads til en ny post - flyt alle poster med 2 (1 for lft og 1 for rgt):

    OPDATERING tbl_categories SET rgt=rgt+2 WHERE rgt>=10 BESTIL EFTER rgt DESC

    OPDATERING tbl_categories SET lft=lft+2 WHERE lft>=10 BESTIL EFTER lft DESC

Bemærk her ORDER aftagende. Som lft og rgt formodes at være unikke, anbefales det at lave en UNIQUE begrænsning på dem, og derefter er faldende rækkefølge i opdatering nødvendig for at forhindre duplikerede nøglefejl.

  1. Indstil lft= og rgt= og indsæt en ny post...

    INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...

Du kan finde mere detaljerede eksempler med kode, hvis du søger efter MPTT PHP MySQL . Der er en del tutorials om dette emne.



  1. Opretter du tilpassede html-tags til CMS?

  2. Hvorfor kan Java ikke oprette forbindelse til MySQL 5.7 efter den seneste JDK-opdatering, og hvordan skal det rettes? (ssl.SSLHandshakeException:Ingen passende protokol)

  3. Sådan opretter du triggere i Codeigniters migrationsbibliotek

  4. Betinget i MYSQL where klausul