Jump to content
php.lv forumi

Visu subkategoriju iegūšana


nemakuphp

Recommended Posts

Š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 by nemakuphp
Link to comment
Share on other sites

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 by briedis
Link to comment
Share on other sites

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 by 2easy
Link to comment
Share on other sites

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: post-799-126540101724_thumb.jpg

Draft vizuālais: post-799-126540102929_thumb.jpg

Gatavā tabula: post-799-12654010405_thumb.jpg

 

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 by briedis
Link to comment
Share on other sites

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 by 2easy
Link to comment
Share on other sites

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 by codez
Link to comment
Share on other sites

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 by 2easy
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...