Versio

Recursieve sql?

Overzicht Reageren

Bienze onbekend

Bienze onbekend

13/01/2011 21:31:47
Quote Anchor link
Hi,

Ik heb een tabel met items. Elk item kan verwijzen naar een parent item.

[items]
id
naam
parent_item_id

Stel ik heb nu een item met id 3, dan wil ik daarbij alle gekoppelde items hebben.

Poging 1:
select id
from items
where parent_item_id = '3'

Nu het probleem. Want de tabelopzet laat een soort van boomstructuur toe. Er kunnen dus meerdere laten zijn van items waarnaar word verwezen via een parent_item_id.

item A --> item B --> item C

Met bovenstaande query krijg ik alleen 1 laag diep.

Heeft iemand enig idee hoe ik dit op kan lossen?
 
PHP hulp

PHP hulp

25/05/2012 14:16:08
Gesponsorde koppelingen:
 
Karl Karl

Karl Karl

13/01/2011 21:57:06
 
Kees Schepers
Moderator

kees Schepers

13/01/2011 22:45:49
Quote Anchor link
Ik heb dat artikel ook al eens een keer gelezen. En is best interessant het enige vervelende is dat je een left en right waarde bij moet gaan houden voor elke rij. En dit moet je bij elke wijziging doen. Een oplossing hiervoor zou eventueel het gebruiken van triggers kunnen zijn.

Een andere oplossing is het in PHP code doen bijv.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$sql
= 'SELECT id, item, parentid FROM items';
$items = array(); //$items[parent][] = $row;
function getItems($parent) {
    global $items;
    foreach($items[$parent] as $item) {
        //doe iets met $item (<li>$item</li> bijv)
        
        
        //is hij zelf ook parent?

        if(array_key_exists($items[$item['id']])) {
            getItems($item['id']);
        }
    }
}

?>


Misschien heb je er wat aan :)
Gewijzigd op 13/01/2011 22:46:13 door kees Schepers
 
Karl Karl

Karl Karl

13/01/2011 22:54:35
Quote Anchor link
Left en right heeft te maken met dat het op een bepaalde manier wordt opgeslagen.
Jou oplossing vind ik niet echt net, dit is beter.
 
Kees Schepers
Moderator

kees Schepers

13/01/2011 23:22:30
Quote Anchor link
Met je eens, mijn voorbeeld was ook uit de losse pols om een idee te geven hoe het een beetje werkt. ;) Uiteraard kan het netter.
 



Overzicht Reageren