[SQL] Nombre de requête élevé pour un menu
Bonjour à tous,
je développe actuellement un site personnel en PHP.
Là je travaille sur le menu principale.
Ce menu se compose de sous-menus, qui peuvent contenir des sous-menus, etc...
Tous le menus est enregistré dans une table de ma base de donnée (MySql), dont voici la structure (j'ai enlevé les colonnes inutiles) :
Code:
1 2 3 4 5 6 7 8
| CREATE TABLE `menu` (
`id_menu` int(11) NOT NULL auto_increment,
`nom_menu` varchar(100) NOT NULL,
`ordre_menu` int(11) NOT NULL,
`id_menu_pere` int(11) NOT NULL,
`nb_sous_menu` int(11) NOT NULL,
PRIMARY KEY (`id_menu`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=52 ; |
Tout mon menu doit être placé dans un array, qui contiendra les menus, puis les sous-menus, dans des array, etc...
Voici le code actuelle :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| function sous_menu($menu_pere)
{
global $BdD;
$sous_menu = Array();
$retour_sous_menu = $BdD->mysql_query('SELECT * FROM menu WHERE id_menu_pere='.$menu_pere['id_menu'].' ORDER BY ordre_menu');
while($donnee_sous_menu = mysql_fetch_array($retour_sous_menu))
{
if($donnee_sous_menu['nb_sous_menu']!=0)
$donnee_sous_menu['sous_menu'] = sous_menu($donnee_sous_menu);
array_push($sous_menu,$donnee_sous_menu);
}
return $sous_menu;
}
$menu = Array();
$retour_menu_princ = $BdD->mysql_query('SELECT * FROM menu WHERE id_menu_pere=0 ORDER BY ordre_menu');
while($donnee_menu_princ = mysql_fetch_array($retour_menu_princ))
{
if($donnee_menu_princ['nb_sous_menu']!=0)
$donnee_menu_princ['sous_menu'] = sous_menu($donnee_menu_princ);
array_push($menu,$donnee_menu_princ);
} |
Comme vous pouvez le voir, pour chaque sous-menus, je fais une requête SQL, et pour l'heure cette page me fais plus de 30 requêtes sql, pour m'afficher ce menu.
Pouvez vous m'aider à améliorer ce script ?
Merci d'avance pour vos réponse et pour votre aide.
Information : Le fait de mettre le menu de la sorte dans un array est très important car j'utilise le template Smarty pour l'affichage de mes pages.
EDIT :
Descriptions des champs :
id_menu (Id du menu)
nom_menu (Nom a afficher)
ordre_menu (ordre d'affichage, 1, 2, 3, etc... )
id_menu_pere (id de menu a qui appartient ce menu, 0 pour le premier menu)
nb_sous_menu (Nombre de sous-menu, 0 si pas de sous-menus)