nemakuphp Posted February 5, 2010 Report Share Posted February 5, 2010 (edited) Šoreiz ir nepieciešams iegūt no datubāzes kādai kategorijai visas subkategorijas, norādot kategorijas id. Datubāzē ir tabula, kurā ir 'kategorijas_id' un 'parent_id'. Kāds būtu labākais veids, kā iegūt visu apakšlīmeņu kategoriju id? Piemēram, šādi cat_id | parent_id 1 | 0 2 | 1 3 | 1 4 | 2 5 | 3 Un izvelkot subkategorijas no kategorijas 1 atgriež 2, 3, 4, 5 (secība nav svarīga) Edited February 5, 2010 by nemakuphp Quote Link to comment Share on other sites More sharing options...
2easy Posted February 5, 2010 Report Share Posted February 5, 2010 konkrētam līmenim izmanto attiecīgi arī tik pat daudz JOINus. bet vispārīgi jebkura dziļuma apakškategorijai sanāk, ka vajag rekursīvi selektēt... nez vai to var izdarīt ar vienu SELECT Quote Link to comment Share on other sites More sharing options...
briedis Posted February 5, 2010 Report Share Posted February 5, 2010 (edited) Pirms kāda laika taisīju subkategoriju sistēmu. Taisīju tā, ka tabula glabājās visas kategorijas sakārtotā veidā. Tabulai bija kolonnas id, parent_id un level. Lai iegūtu visas vai kādu atsevišķu kategoriju vai apakšakategoriju pietiek ar 1 kvēriju. Bija viena draft tabula, kura bija priekš kategoriju menedžēšanas (pievienošanas, dzēšanas), kad rediģēšana bija pabeigta, tad nospieda podziņu publish un viss tika saglabāts gatavajā kategoriju tabulā jau sakārtots, un ar attiecīgajiem level`iem. Edited February 5, 2010 by briedis Quote Link to comment Share on other sites More sharing options...
2easy Posted February 5, 2010 Report Share Posted February 5, 2010 (edited) tātad viņam tur vajadzētu kādu papildus kolonnu, lai šos datus varētu paņemt uzreiz ar 1x SELECT. un kā tu iesaki darīt? tb kāds būtu simple example tam kverijam balstoties uz jau esošo piemēru + level kolonnu? Edited February 5, 2010 by 2easy Quote Link to comment Share on other sites More sharing options...
briedis Posted February 5, 2010 Report Share Posted February 5, 2010 (edited) Nu, ja ir zināms viens vecāks (kategorija A), kam vajag atlasīt visus visus bērnus, tad atlasam visas kategorijas no tabulas, ejam ciklā cauri, līdz atrodam A kategoriju, piefiksējam A leveli (piemēram, 2. levels), ejam tālāk cauri kategorijām un skatamies, un pievienojam vajadzīgajam sarakstam visas secīgās kategorijas, kam levels būs 3. un vairāk (jo A bija 2.). Tiklīdz satiekam kādu kategoriju kam arī levels ir 2. secinam, ka tas ir A siblings, un ka tālāk vairs nebūs A bērni. Eh, grūti izstāstīt, bet cerams ka sapratāt.. Edit: pievienoju attēlus, kā izskatās gan gatavā tabula, gan draft, gan kā vizuāli... Draft tabula: Draft vizuālais: Gatavā tabula: Edit2: kā to atlasīt uzreiz ar kvēriju hz, bet ar php tik cik viens cikls (sliktākajā gadījumā pilns) iziet cauri visām kategorijām... Domāju, tas būtu daudz daudz labāks variants par rekursivitāti :) Edited February 5, 2010 by briedis Quote Link to comment Share on other sites More sharing options...
2easy Posted February 5, 2010 Report Share Posted February 5, 2010 (edited) ohh, tu piedāvā selektēt visu un lēmumus pieņemt php pusē? es jau gribēju sagaidīt kādu krutu sql, kas to visu izdara on the fly ;) nju ja tur nav ļoti daudz to kategoriju, tad jau ir ok tādā gadījumā, lai tas algoritms darbotos, ir ļoti svarīgi, kāds ir ORDER BY? un vai ir pieļaujams, ka kategorija ar tādu pašu nosaukumu var atrasties citā līmenī vai tajā pašā līmenī, bet kādā paralēlā zarā? :D EDIT: ok šo var atrisināt, ka atlase notiek pēc unikāla id, un tas name ir tikai vizuāla info. bet anyway kā ir ar to ORDER BY? EDIT2: lol, pamanīju ORDER BY order_main ASC. okok, vairs nepiesienos. viss sk. good job ;) Edited February 5, 2010 by 2easy Quote Link to comment Share on other sites More sharing options...
briedis Posted February 5, 2010 Report Share Posted February 5, 2010 (edited) Nevajadzētu būt problēmām uzrakstīt sql galā vienu procedūru, kas atgriež vienu kategoriju ar bērniem ;) Tad arī būs ar vienu kvēriju vēlamais :) Edited February 5, 2010 by briedis Quote Link to comment Share on other sites More sharing options...
2easy Posted February 5, 2010 Report Share Posted February 5, 2010 tad jau labāk php :P Quote Link to comment Share on other sites More sharing options...
marrtins Posted February 6, 2010 Report Share Posted February 6, 2010 (edited) Negrib rekursīvu koka apstaigāšanu? Var arī šādi: Modified Preorder Tree Traversal Es personīgi izmantoju rekursīvu koku, jo tie koki reti kad ir pietiekami lieli. Teiksim, Internet vaikalam ar 100000 precēm un daudz, daudz kategorijām varētu šo izmantot. Edited February 6, 2010 by marrtins Quote Link to comment Share on other sites More sharing options...
codez Posted February 6, 2010 Report Share Posted February 6, 2010 (edited) tiko radās tāda ideja: katrai kategorijai liekam atsevišķā laukā visus parentu id, tipa Šādai struktūrai: 1 --2 ----3 --4 ----5 ----6 7 --8 ----9 ----10 --11 ----12 piemēram, id speciālais lauks 1 1, 2 1,2, 3 1,2,3, 4 1,4, 5 1,4,5, 6 1,4,6, 7 7, 8 7,8 utt. un tad piemēram, lai ieselektotu visus 2-subkategorijas, selektojam LIKE '1,2,*', būs 2. un 3. lai ieslektotu visus 1. apakškategorijas, selektojam LIKE '1,*', būs 1.-6. Vienīgā problēma, ja notiek kategorijas pārbīde, tad tās visi apakšelementi jāpārveido. Edited February 6, 2010 by codez Quote Link to comment Share on other sites More sharing options...
2easy Posted February 6, 2010 Report Share Posted February 6, 2010 cool Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted February 6, 2010 Report Share Posted February 6, 2010 http://datubazes.wordpress.com/2008/11/11/rekursivie-vaicajumi/ Quote Link to comment Share on other sites More sharing options...
2easy Posted February 6, 2010 Report Share Posted February 6, 2010 (edited) labs links uz labu resursu, taču ne tur, ne arī no turienes pielinkotajos rakstos nebija šāds uzdevums apskatīts. bija visādi citi, bet ne pilns visu apakškategoriju selekts. līdz ar to codez variants pagaidām ir pats īsākais un vnkāršākais no selektēšanas viedokļa. tas ka pie datu izmaiņām būtu vairāk jāmenedžē, tas ir ok. galvenais, ka select ir optimizēts ^^ EDIT: sry, vienā no tiem linkiem bija gan risinājums: The Nested Set Model (tas pats, ko marrtins sauca par Modified Preorder Tree Traversal) Edited February 6, 2010 by 2easy Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted February 7, 2010 Report Share Posted February 7, 2010 Ka jau saitē rakstīts, MySQLā to tīri ar SQL izdarīt nevar, ja vien nelieto speciālas db konstrukcijas. Piemēram, Oraclē un SQL serverī var. Gints Plivna http://datubazes.wordpress.com Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.