Ik heb voor een website een menustructuur en hiervan wil ik op iedere pagina weergeven:
Nu kan ik wel recursief vanaf het huidige punt steeds de menu_parent_id opvragen en daarmee zijn kinderen oppikken net zolang tot ik aan het hoogste punt ben gekomen, maar dat vindt ik geen mooie oplossing voor als de menustructuur redelijk diep is en ik vraag me af of het beter kan...
Nu heb ik hieronder even snel een menustructuur opgemaakt wat een mogelijkheid is op de site;
Als ik in dit voorbeeld "Boeken" als huidige webpagina heb geopend, dan wil ik dat in dit voorbeeld alles zichtbaar wordt dat op een zelfde of lager niveau (level) staat dan "boeken" behalve de menu items waarvoor je eerst een niveau lager moet (-1) en dan weer omhoog (+1) om er te komen. Wat in dit voorbeeld 2004 en 2005 zijn.
Dus in plaats van dit:
Wil ik dit ophalen:
de menu_left, menu_right en menu_level zijn voor de nested set methode (of modified preorder tree traversal) en de menu_parent_id en menu_order velden zijn voor de voor iedereen bekende hierarchische aanpak.
Ik kan queries bedenken voor alle (voor)ouders + alle level 1 items
- het huidige punt in de website
- alle DIRECTE kinderen van dit menu item
- alle (voor)ouders
- alle directe kinderen van de (voor)oudersalle sibblings van de (voor)ouders, dus alle items met dezelfde parent van iedere voorouder die opgehaald moet worden.
Nu kan ik wel recursief vanaf het huidige punt steeds de menu_parent_id opvragen en daarmee zijn kinderen oppikken net zolang tot ik aan het hoogste punt ben gekomen, maar dat vindt ik geen mooie oplossing voor als de menustructuur redelijk diep is en ik vraag me af of het beter kan...
Nu heb ik hieronder even snel een menustructuur opgemaakt wat een mogelijkheid is op de site;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| +-------+---------+---------+----------+----------+--------------+----------+ |menu_id|menu_name|menu_left|menu_right|menu_level|menu_parent_id|menu_order| +-------+---------+---------+----------+----------+--------------+----------+ | 1 |Menuroot^| 1 | 26 | 0 | 0 | 1 | | 2 |Start | 2 | 3 | 1 | 1 | 1 | | 4 |Over ons | 4 | 5 | 1 | 1 | 2 | | 3 |Producten| 6 | 21 | 1 | 1 | 3 | | 5 |Drukvorm | 7 | 12 | 2 | 3 | 1 | | 7 |Boeken* | 8 | 9 | 3 | 5 | 1 | | 8 |Posters | 10 | 11 | 3 | 5 | 2 | | 6 |CD-ROM | 13 | 18 | 2 | 3 | 2 | | 9 |2004** | 14 | 15 | 3 | 6 | 1 | | 10 |2005** | 16 | 17 | 3 | 6 | 2 | | 11 |Online | 19 | 20 | 2 | 3 | 3 | | 12 |Vacatures| 22 | 23 | 1 | 1 | 4 | | 13 |Contact | 24 | 25 | 1 | 1 | 5 | +-------+---------+---------+----------+----------+--------------+----------+ |^ nooit zichtbaar | |* het "huidige" menu item | |** het niet weer te geven item | +---------------------------------------------------------------------------+ |
Als ik in dit voorbeeld "Boeken" als huidige webpagina heb geopend, dan wil ik dat in dit voorbeeld alles zichtbaar wordt dat op een zelfde of lager niveau (level) staat dan "boeken" behalve de menu items waarvoor je eerst een niveau lager moet (-1) en dan weer omhoog (+1) om er te komen. Wat in dit voorbeeld 2004 en 2005 zijn.
Dus in plaats van dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| Menuroot^ +- Start | +- Over ons | +- Producten | +- Drukvorm | | +- Boeken* | | | | | +- Posters | | | +- CD-ROM | | +- 2004** | | | | | +- 2005** | | | +- Online | +- Vacatures | +- Contact |
Wil ik dit ophalen:
code:
En wel met 1 query 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Menuroot^ +- Start | +- Over ons | +- Producten | +- Drukvorm | | +- Boeken* | | | | | +- Posters | | | +- CD-ROM | | | +- Online | +- Vacatures | +- Contact |
de menu_left, menu_right en menu_level zijn voor de nested set methode (of modified preorder tree traversal) en de menu_parent_id en menu_order velden zijn voor de voor iedereen bekende hierarchische aanpak.
Ik kan queries bedenken voor alle (voor)ouders + alle level 1 items
code:
Alleen laat die het item "posters" niet zien. Op deze wijze heb ik nog meer queries bedacht of proberen te bedenken, maar ik kom er steeds op uit dat ik recursie nodig heb. Of heb ik het mis??
1
2
3
4
5
6
7
8
9
10
| SELECT *
FROM ew1_menu
WHERE menu_level = 1
OR ( menu_left <= 8
AND menu_right >= 9 )
OR ( menu_left > 8
AND menu_right < 9
AND menu_level = 4 )
ORDER BY menu_left
, menu_order |
[ Voor 8% gewijzigd door RwD op 03-10-2005 13:54 ]