Subqueries om recursief te werk te gaan?
Op mijn blog op http://alphabase.nl/?p=blog_cat heb ik op zeer eenvoudige wijze een blog gemaakt die aan de hand van categories en parents in categorieën is verdeeld.
Nu kan ik vanuit de huidige categorie wel testen hoeveel subcats mijn subcats hebben en hoeveel items mijn subcats hebben. Maar eigenlijk wil ik erachter ook tussen haakjes zetten hoeveel subcats en items mijn subcats in totaal hebben.
Dan ziet het er bijvoorbeeld als volgt uit:
- Category 1 - 3 cats (4 total) - 2 items (6 total)
- Category 2 - 1 cats (8 total) - 0 items (32 total)
Zo weet je dat een categorie die geen items direct bevat, in zijn subcats daarna misschien wel interessante info heeft.
Het lijkt me echter niet zo zeer effectief om via php een loop te maken die constant queries uitvoert, want bij een groeiende blog worden het dan aanzienlijk veel queries die moeten worden uitgevoerd.
Hoe kan ik dit probleem tackelen?
Alvast bedankt!
Gerard
Ik vermoed dat dit je niet in 1 query gaat lukken. In het ene geval vraag je namelijk informatie op van afzonderlijke (sub)categorieën en in het andere geval wil je juist gegeven over de hele groep weten. Je zult hier dus wel een aparte query voor op moeten stellen met daarin waarschijnlijk een COUNT() en een GROUP BY op hoofdcategorie om de totalen te bepalen.
De makkelijkste manier is al je categorien plus aantal (in die categorie) ophalen en in PHP dit recursief weer naar de parent toe laten lopen.
Wat ook nog kan en wat altijd efficienter is dan dit in PHP met loopjes doen is een stored function maken die wel steeds queries draait. Omdat dit binnen de database blijft heb je 0.1 overhead.
Nested set model is in dit geval wel een oplossing, maar het gebruik van dit model is een heel andere aanpak kan het convetionele model.
Een erg populaire uitleg over nested set en MySql staat op de MySql site zelf. :
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
Een nadeel van het model is dat je een linker en rechter waarden hebt, het is niet mogelijk om zomaar een record er tussen uit te halen zonder dat je "Tree" geheel wijzigd.
Pim:
Zoekt en gij zult vinden:
http://articles.sitepoint.com/article/hierarchical-data-database
http://articles.sitepoint.com/article/hierarchical-data-database
En zelfs als dat niet kan, is dat niet zo'n probleem. Hoe vaak verwijder je nou een groep vergeleken met hoe vaak je een tree opvraagt?
Pim:
Ze hebben het in pagina 3 over een mogelijkheid items toe te voegen, is er dan niets te verzinnen om items ook weer weg te halen?
En zelfs als dat niet kan, is dat niet zo'n probleem. Hoe vaak verwijder je nou een groep vergeleken met hoe vaak je een tree opvraagt?
En zelfs als dat niet kan, is dat niet zo'n probleem. Hoe vaak verwijder je nou een groep vergeleken met hoe vaak je een tree opvraagt?
Het is zeker mogelijk om een item of een groep opnieuw te verwijderen. Je baseert je op de grenswaarden (links en rechts) om één item weg te halen.
Wanneer je een groep wenst weg te halen dan verhoog je de linker- en/of rechtergrenzen.
Het enige waar je rekening mee zult moeten houden is denk ik dat je een of meerdere grenzen van bestaande waarden zou moeten aanpassen.
Echter ben ik daar ook even het spoor bijster. Ik ben mij bekend met dit model maar ik heb ze nooit concreet toegepast. Ik ben echter zeker dat hier ergens nog wel een lid schuilt die een beter antwoord kan geven, dan ik.
Gewijzigd op 29/05/2010 19:48:11 door Tom Beuckelaere
Premodified trees zijn overbodig, zoals ik al zei. Deze functionaliteit is doodeenvoudig in de database zelf te implementeren middels stored functions.