Aller au contenu

[MySQL] Chapitre, sous-chapitre & sous-sous-chapitre - éviter les boucles ?


Sujets conseillés

Posté

Bonjour à tous.

Je suis en train de faire un site de tutoriaux informatiques en tout genre, et je suis bloqué sur un problème assez complexe (pour un gros débutant en SQL comme moi ;) )

En effet, j'ai 3 tables : Cours, Chapitres et Tutoriaux.

Chaque cours peut contenir un nombre illimité de chapitres et chaque chapitre peut contenir un nombre illimité de tutoriaux. Il y a aussi la table Membres qui contiens les données des utilisateurs.

Cependant, je ne sais pas comment éviter de mettre des requêtes dans des boucles (ce qui demande beaucoup de ressources).

Je vous montre un peu mon code :

$req = mysql_query('
SELECT c.cours_id,
c.cours_user_id,
c.cours_titre,
c.cours_intro,
c.cours_conclusion,
DATE_FORMAT(c.cours_date, "%d/%m/%Y à %Hh%m") AS cours_date,
DATE_FORMAT(c.cours_update_date, "%d/%m/%Y à %Hh%m") AS cours_update_date,
c.cours_image,
m.user_pseudo,
m.user_avatar
FROM cours c
LEFT JOIN membres m ON c.cours_user_id = m.user_id
WHERE c.cours_id = "'.$cours_id.'"
GROUP BY c.cours_id
');

$cours = mysql_fetch_assoc($req)or die(redirection('index.php','Le cours sélectionné n\'existe pas'));

Jusque là, pas de problèmes. Je séléctionne le cours et je fais une jointure avec la table membres pour afficher le pseudo de l'utilisateur qui a écrit le cours et son avatar.

C'est après que les choses se gâtent :

$req = mysql_query('
SELECT chap_id,
chap_titre,
chap_intro,
chap_conclusion
FROM chapitres
WHERE chap_cours_id = "'.$cours_id.'"
ORDER BY chap_id
');

while($chapitre = mysql_fetch_assoc($req))
{
?>
<h2 id="#chapitre-<?php echo $chapitre['chap_id'] ?>"><?php echo $chapitre['chap_titre'] ?></h2>
<?php echo $chapitre['chap_intro'];

Je sélectionne les chapitres et je fais une boucle.

Maintenant, je veux afficher les tutoriaux (sous-chapitres) et je ne vois pas d'autre choix que de faire encore une boucle :(

$req2 = sql('
SELECT tuto_id,
tuto_cat_id,
tuto_name,
tuto_image
FROM tutoriaux
WHERE tuto_cat_id = "'.$chapitre['chap_id'].'"
ORDER BY tuto_date
');
while($tuto = mysql_fetch_assoc($req2))
{
echo $tuto['tuto_name'] . '<br />';
?>
<div class="tuto_sommaire">
<img src="<?php echo $tuto['tuto_image'] ?>" alt="" />
</div>
<?php
}
echo $chapitre['chap_conclusion'];

Voilà. Le problème c'est qu'en faisant cela, je demande beaucoup de ressources à MySQL. Je suis presque sûr qu'il y a un moyen d'éviter ça et je demande votre aide. :unsure:

Peut-être je dois utiliser une autre structure pour ma base de données ?

Merci d'avance de votre aide.

Posté

Bonjour,

Je te conseille d'intéresser au sujet "Représentation d'arborescence en PHP depuis MySQL", il décrit les avantages d'une structure arborescente en "Nested sets" (accès à une partie ou à tous l'arbre en une requête et modifications de noeuds impliquant un changement de tous les noeuds en aval)... par rapport à la structure "Adjacente" (accès récursif, modifications de noeuds individuelles).

Selon moi ton cas un très bon exemple qui justifie l'utilisation de ce modèle "Nested sets", l'accès à l'arbre sera certainement plus courant que les modifications de ce dernier, donc l'optimisation doit se faire pour l'accès.

Bonne lecture et bonne continuation.

Posté

Merci beaucoup, TheRec :)

C'est exactement ce que je cherchais. Je vais lire le cours et je verrais comment intégrer tout ça à mon système.

A+

Posté

De rien ;) Le fait que ce soit une classe en PHP devrait te simplifier la tâche pour l'inclure dans ton projet :) Bonne chance.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...