Requête SQL pour charger une structure récursive
Bonjour à tous !
Avant de commencer, j'ai fait plusieurs recherches, et il existe beaucoup de sujets semblable, mais je n'ai rien trouvé d'assez précis.
J'ai donc un menu du genre:
Code:
1 2 3 4 5 6 7 8 9 10
|
- zone 1
-- section 1
-- section 2
- zone 2
-- section 3
--- catégorie 1
--- catégorie 2
-- section 4
etc... |
Pour ce menu, je ne ne connais pas le nombre de profondeur de niveaux. Il peut y en avoir une infinité. La seule chose dont je suis sur, c'est qu'il n'y a pas de boucle dans les références.
Pour ce menu, j'ai une table MySQL dont la structure (pour l'exemple) est très simple:
Code:
1 2 3 4
|
- id
- parentId
- nom |
ce qui donne:
Code:
1 2 3 4 5 6 7 8 9
|
1, 0, "zone 1"
2, 1, "section 1"
3, 1, "section 2"
4, 0, "zone 2"
5, 4, "section 3"
6, 5, "catégorie 1"
7, 5, "catégorie 2"
8, 4, "section 4" |
Actuellement, tout les résultats sont en ordre. Les zone toujours avant les section, et les section toujours avant les catégories.
Mais considérons que ce soit le "bordel" ( j'ai changé les id, mais la hyérarchie n'à pas changée. Le menu devrait être identique ):
Code:
1 2 3 4 5 6 7 8 9
|
1, 3, "section 1"
2, 3, "section 2"
3, 0, "zone 1"
4, 7, "catégorie 1"
5, 7, "catégorie 2"
6, 0, "zone 2"
7, 6, "section 3"
8, 6, "section 4" |
Je cherche à effectuer une (1) requête afin de récupérer l'ensemble des données et de pouvoir constituer soit un array multi-dimensionnel, soit un objets qui se contiens lui-même récursivement (pattern composite je crois)
Actuellement, si je charge les données, j'aurais un problème:
Lorsque je voudrais associer la catégorie 1 (id #4), je ne pourrais pas, car l'item section 3 (id #7) n'existe pas encore...
donc logiquement, je me dis que je devrais faire une fonction récursive, telle que:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
function loadMenu($parentId)
{
//Trouver et charger tous les éléments parentId = $parentId
....
$arr[] = mysql_fetch_assoc(....);
foreach($arr as $key=>$elem)
$arr[$key]['sub'] = loadMenu($elem['parentId']); //Charger tous les éléments enfants
return $arr;
}
$arr = loadMenu(0);
var_dump($arr); |
... sauf que cette méthode implique de faire une requête de facon récursive, et je ne veux pas faire celà.
Ma question est donc: En une seule requête, comment puis-je, extraire mes résultats efficacement dans ce cas de figure ?
Question connexe:
En terme de performance, puis-je me permettre de faire des exécution de requête de facon récursive si j'utilise PDO avec une requête préparée ?