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

MYSQL-output i træformat ELLER Tilføjelse af niveau (forælder-barn)

Selvom du ikke kan klare en enkelt forespørgsel, kan du klare dig med en lagret procedure... Det eneste forudgående krav, du skal tilføje 2 flere poster til din eksisterende eksempeltabel for at repræsentere, at "C1" og "C2" ER det øverste niveau... Tilføj en post, hvor feltet "Forælder" er tomt, og underordnet niveau er "C1" og en anden for "C2". Dette vil "forberede" det øverste overordnede niveau. for efterfølgende hierarkitilknytning, ellers har du ikke noget start "grundlag" for topniveauhierarkiet. Det kræver også en "primær nøgle"-kolonne (som jeg har oprettet i dette script som "IDMyTable", som kun er 1-x sekventiel, men ville antage, at du har en auto-increment-kolonne på din tabel til at bruge i stedet).

Jeg har inkluderet alle outputkolonner for at vise, HVORDAN den er bygget, men forudsætningen for denne rutine er at skabe en tabel baseret på de forventede kolonneoutput, men dog ekstra for at holde den hierarkiske repræsentation nedstrøms, mens den bygges. For at sikre, at de bevarer den korrekte orientering, efterhånden som lagene bliver dybere, sammensætter jeg "ID"-kolonnen -- du vil se, hvordan det fungerer i det endelige resultatsæt.

Derefter, i det endelige resultatsæt, udfylder jeg mellemrum på forhånd baseret på, hvor dybe hierarkidataene er.

Sløjfen tilføjer alle poster baseret på, at deres forælder findes i det foregående resultatsæt, men kun hvis ID'et ikke allerede er tilføjet (forhindrer dubletter)...

For at se, hvordan den cykliske rækkefølge konstant blev tilføjet, kan du køre den sidste forespørgsel UDEN rækkefølgen af ​​og se, hvordan hver iteration kvalificerede og tilføjede det tidligere hierarkiniveau blev anvendt...

-- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine body will not be stored by the server -- -------------------------------------------------------------------------------- DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `GetHierarchy2`() BEGIN -- prepare a hierarchy level variable set @hierlvl := 00000; -- prepare a variable for total rows so we know when no more rows found set @lastRowCount := 0; -- pre-drop temp table drop table if exists MyHierarchy; -- now, create it as the first level you want... -- ie: a specific top level of all "no parent" entries -- or parameterize the function and ask for a specific "ID". -- add extra column as flag for next set of ID's to load into this. create table MyHierarchy as select t1.IDMyTable, t1.Child AS Parent, @hierlvl as IDHierLevel, cast( t1.IDMyTable as char(100)) FullHierarchy from MyTable t1 where t1.Parent is null OR t1.Parent = ''; -- how many rows are we starting with at this tier level set @lastRowCount := ROW_COUNT(); -- we need to have a "primary key", otherwise our UPDATE -- statement will nag about an unsafe update command alter table MyHierarchy add primary key (IDMyTable); -- NOW, keep cycling through until we get no more records while @lastRowCount > 0 do -- NOW, load in all entries found from full-set NOT already processed insert into MyHierarchy select t1.IDMyTable, t1.Child as Parent, h1.IDHierLevel +1 as IDHierLevel, concat_ws( ',', h1.FullHierarchy, t1.IDMyTable ) as FullHierarchy from MyTable t1 join MyHierarchy h1 on t1.Parent = h1.Parent left join MyHierarchy h2 on t1.IDMyTable = h2.IDMyTable where h2.IDMyTable is null; set @lastRowCount := row_count(); -- now, update the hierarchy level set @hierLevel := @hierLevel +1; end while; -- return the final set now select *, concat( lpad( ' ', 1 + (IDHierLevel * 3 ), ' ' ), Parent ) as ShowHierarchy from MyHierarchy order by FullHierarchy; END

  1. Adgang til klassemodul og indpakningsklasser

  2. Hvordan bruger man strftime og datetime korrekt ved hjælp af Room library?

  3. Formatering af DATE i oracle

  4. Sammensat indeks for en relationstabel