id parid value
1 0 value 1
2 0 value 2
3 1 sub of 1
4 1 sub of 1
5 2 sub of 2
6 2 sub of 2
7 5 sub of 5
parid is de parent_id en verwijst naar het id in dezelfde tabel
De bedoeling is dat deze herordend kan worden naar deze volgorde:
1 0 value 1
3 1 sub of 1
4 1 sub of 1
2 0 value 2
5 2 sub of 2
7 5 sub of 5
6 2 sub of 2
Zoals je ziet moeten de parent id's onder de gekoppelde id's komen. (record 1 heeft 2 sub id's, namelijk records 3 en 4, dus die moeten onder die record 1 komen)
Kan ik deze ordening toegepast krijgen in MySQL? Of is het beter te doen in PHP?
Ik werk in Laravel, dus mijn databank data kan als collection behandeld worden.
Ter info, de diepte van de subs kan eindeloos zijn.
@Ivo P: Betreffende de parid 0 heb je helemaal gelijk. Dit zou inderdaad NULL moeten zijn. Maar als ik dit aanpas, krijg ik nog steeds dezelfde foute ordening:
originele data:
id parid value
1 NULL value 1
2 NULL value 2
3 1 sub of 1
4 1 sub of 1
5 2 sub of 2
6 2 sub of 2
7 5 sub of 5
Resultaat na de query is hetzelfde...
[size=xsmall]Toevoeging op 31/08/2017 08:55:50:[/size]
Iemand een idee alsjeblieft? Misschien bestaat de mogelijkheid om de resultaten als array te bewerken in PHP om zo het gewenste resultaat te bereiken?
Dank u Ward, Maar dit werkt enkel voor de eerste diepte, namelijk alle subs onder de hoofd categorie. Maar extra subs worden niet correct geordend. Bestaat daar ook een oplossing voor?
Hi Jan, bedankt voor je reactie! Ik heb een oplossing gevonden!
Ik haal alle records uit de tabel (SELECT * FROM tabel ORDER BY id), vervolgens haal ik die array door jouw functie en bouw ik zo een nieuwe, correct geordende array.
Ik werk in Laravel, en laravel gebruikt collecties, dus moest ik de functie even aanpassen: hier mijn oplossing:
// Alle rijen binnenhalen
$records = App\Record::->all();
$ids = array();
$teller = 0;
function setorder($parid = 0, $tree){
global $ids;
global $teller;
foreach ($tree as $node) {
if ($node->main_group_id === $parid) {
// nieuwe array $ids aanvullen met gegevens
$ids[$teller]['id'] = $node->id;
$ids[$teller]['level'] = $node->level;
$ids[$teller]['final'] = $node->final;
$teller++;
setorder($node->id, $tree);
}
}
return $ids;
}
$d = setorder(0, $specs);
// array omzetten naar collectie
$d = collect($d);
dd($d);