Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] Pad + diepte in Nested Set hierarchie

Pagina: 1
Acties:

  • Xcalibur
  • Registratie: Augustus 2002
  • Laatst online: 14:31
Is iemand bekend met het Nested Set model, om een hierarchische structuur in een database op te slaan? Wat uitleg alhier: http://dev.mysql.com/tech...es/hierarchical-data.html

Ik ben bezig een systeem te maken op basis van dit principe, waarbij ik verschillende categorieën kan maken met dezelfde naam. Op zich niet zo lastig, als ze maar een andere id hebben natuurlijk, maar ik wil ze op naam kunnen selecteren (naam komt uit de URL: /categorie/subcategorie). Op zich werkt dit, maar het gaat nog stuk als ik een categorie heb met de zelfde naam als één van z'n parents.

Oplossing: check op welke diepte in de structuur ze zitten, en verwerk dat in de logica. En daar kom ik dus niet uit. Ik heb de volgende query (zie ook het artikel) om m'n pad te bepalen:

code:
1
2
3
4
5
6
SELECT parent.name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = 'FLASH'
ORDER BY parent.lft;


Maar daar zit de diepte niet in. Ik heb ook een query om de diepte te bepalen, maar daarin krijg je de diepte van alle categorieën, en niet alleen van je pad zoals hierboven.

code:
1
2
3
4
5
6
SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;


Wat ik dus zoek is een soort combinatie van bovenstaande queries, die dus het pad + de diepte van iedere node oplevert. Ik krijg het echter niet voor elkaar, ik krijg óf alleen de root, óf alle categorieën, óf junk :{

Iemand? :)

Designer | Developer | Director | Photographer | LARPer | Geek | Male | 39


  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Op diezelfde webpagina van Mysql staat ook iets over het vinden van de diepte.
verder zou je de diepte ook kunnen opslaan in de database.

  • Xcalibur
  • Registratie: Augustus 2002
  • Laatst online: 14:31
Ja, de query voor de diepte staat ook al in mijn verhaal hierboven ;)

De diepte erbij opslaan is misschien wel de gemakkelijkste oplossing. Het valt me alleen een beetje tegen dat die twee queries niet zo gemakkelijk te combineren zijn als ik had gedacht :P

Designer | Developer | Director | Photographer | LARPer | Geek | Male | 39


  • Xcalibur
  • Registratie: Augustus 2002
  • Laatst online: 14:31
Hmm, met een subquery krijg ik nu het niveau van het item wat ik zoek erbij (alle parents krijgen dan ook wel hetzelfde niveau, maar die heb ik daar toch niet nodig). Niet de allermooiste oplossing, maar ik denk wel dat ik er hiermee uit ga komen :)

Designer | Developer | Director | Photographer | LARPer | Geek | Male | 39


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Ik sla de diepte inderdaad op ... dat maakt je queries een stuk makkelijker, kan ik u verklappen.

Verwijderd

Doch niet van toepassing op mysql maar wel op Oracle wil ik deze mogelijkheid wel benoemen. In Oracle bestaat er zoiets als connect by. Dit is speciaal voor hierarchische tabellen gemaakt. Met LEVEL kan je dan de diepte bepalen.

Je krijgt dan zoiets:
SQL:
1
2
3
4
5
 
SELECT LEVEL, LPAD(' ', LEVEL*3) || LAST_NAME AS LAST_NAME
FROM employees
START WITH employee_id = 100
CONNECT BY PRIOR employee_id = manager_id;


Misschien niet van toepassing voor jou als je vastzit aan MySql, maar wellicht hebben toekomstige googlers hier iets aan :)

  • mjax
  • Registratie: September 2000
  • Nu online
Je moet die lft en rgt waardes toch berekenen bij elke mutatie in de boomstructuur? Waarom bereken je dan niet meteen even de diepte en slaat die op als extra veld in de tabel? Dan heb je de diepte altijd bij de hand.

  • Xcalibur
  • Registratie: Augustus 2002
  • Laatst online: 14:31
Dank voor de Oracle oplossing, helaas heb ik daar niets aan :P

De diepte opslaan is misschien wel de meest voor de hand liggende oplossing, toch voelt het een beetje als valsspelen ;) Ik heb nu een manier waarmee ik voorlopig uit de voeten kan, maar het is niet ondenkbaar dat ik later toch nog de diepte erbij op ga slaan...

Designer | Developer | Director | Photographer | LARPer | Geek | Male | 39

Pagina: 1