Aantallen van alle onderliggende records ophalen
Ik ben een website aan het maken waar ik een aantal getallen in wil berekenen.
De hoofdmodule waar het om gaat is een groepen module (tblGroepen). Groepen kunnen oneindig diep aan elkaar worden toegevoegd.
Groepen staan met elkaar gekoppeld doormiddel van een koppel veld.
Elk record heeft als ID veld Grp_ID.
Een gekoppeld record heeft het Grp_ID van de bovenliggende groep in het veld Grp_Grp_ID staan.
In elke groep kunnen aparte records worden toegevoegd in een andere tabel (tblFotos)
De foto's staan gekoppeld met het veld Fot_Grp_ID.
Het probleem waar ik nu tegen aan loop is dat ik bij de hoofdgroep wil tellen hoeveel foto's er binnen vallen.
Oftewel van elke subgroep binnen de hoofdgroep moet ik de foto's tellen.
Ik programmeer al wat jaren maar ik weet gewoon niks te bedenken hoe ik dit sql technisch in 1 query kan maken zonder in PHP te hoeven loopen.
Ik hoop dat iemand mij kan helpen een zetje in de goede richting te geven.
Alvast bedankt!
Gr. Robert
Het is niet een questie van simpel een count toevoegen, was het maar zo makkelijk haha.
Het zit zegmaar zo:
Ik heb deze groepen structuur:
- Hoofdgroep 1
- - Subgroep 1
- - - Sub Subgroep 1
- - - Sub Subgroep 2
- - Subgroep 2
- - Subgroep 3
- - - Sub Subgroep 1
- - - Sub Subgroep 2
- - - Sub Subgroep 3
- - - - Sub Sub Subgroep 1
Nu wil ik voor Hoofdgroep 1 weten hoeveel foto's er in ALLE subgroepen en in ALLE sub subgroepen en in ALLE sub sub subgroepen zitten.
Ik hoop dat dit mijn vraag iets duidelijker maakt.
Gr. Robert
Ben ook benieuwd hoe je nu je volledige groep structuur ophaalt.
De complete tabellenstructuur met bijbehorende relaties is mij nog niet helemaal duidelijk. Als je database gewoon goed is moet dat kunnen met één SQL query.
Hier een klein voorbeeldje hoe je de groepen dan in kun delen. De rode cijfers zijn de lft en rgt waardes.
Wil je bijvoorbeeld alle onderliggende groepen van subgroep 7 (lft = 14, rgt = 19), dan doe je een selectie op groepen met de lft hoger dan 14 en rgt lager dan 19.
Wil je de directe kinderen van de hoofdgroep (lft = 1, rgt = 20, level = 0), dan doe je een selectie op groepen met de lft hoger dan 1, rgt lager dan 20 en level = 1.
Het is even iets lastiger te begrijpen en te beheren, maar uiteindelijk kun je veel meer. Je kunt ook gewoonweg Doctrine gebruiken :)
Gewijzigd op 02/06/2012 16:37:47 door Terence Hersbach
Bedankt voor je reactie, ik ga dit even goed bekijken en kijken of ik het in kan bouwen.
Gr. Robert
Toevoeging op 02/06/2012 20:41:25:
Beste Terence,
Ik snap inmiddels het principe. Nu zit ik alleen nog met het probleem hoe ik die nummers bij de juiste groepen links en rechts ga zetten.
Zou je mij hier misschien ook mee willen helpen?
Gr. Robert
Een tak zonder zijtakken heeft links en rechts opeenvolgende nummers.
Als een tak zijtakken heeft is links 1 lager dan de links van de eerste tak en rechts 1 hoger dan de rechts van de laaste tak, bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Hoofdgroep 1 {1
2}
Hoofdgroep 2 {3
Subgroep 2.1 {4
5}
Subgroep 2.2 {6
Subgroep 2.2.1 {7
8}
Subgroep 2.2.2 {9
10}
11}
12}
2}
Hoofdgroep 2 {3
Subgroep 2.1 {4
5}
Subgroep 2.2 {6
Subgroep 2.2.1 {7
8}
Subgroep 2.2.2 {9
10}
11}
12}
Gewijzigd op 04/06/2012 10:09:12 door Ger van Steenderen