Requete(s) MySQL pour menu avec rubrique et nom des articles

WRInaute accro
Bonjour,
Je galère complètement avec MySQL que je ne connais presque pas.
Je cherche à générer un menu de ce style :
Code:
<p>Rubrique 1</p>
<ul>
<li>Article 1</li>
<li>Article 2</li>
<li>Article 3</li>
</ul>
<p>Rubrique 2</p>
<ul>
<li>Article 1</li>
<li>Article 2</li>
<li>Article 3</li>
</ul>
J'ai deux bases :
- une base 'rubrique' avec comme champs : id et nom
- une base 'articles' avec comme champs : id, idrubrique, nom, contenu
Et je voudrais donc lister chaque catégorie avec chaque article qui est dedans mais je n'y arrive pas :S
Pouvez vous m'aider svp ?
Comment faire ?
Merci beaucoup !
 
WRInaute occasionnel
slt

la structure

select tableart.nomart, tablerub.nomrub from tablerub
left join tableart on
tableart.id_rub=tablerub.id


tablerub
id nom
1 chaussette
2 pantalon

tablart

id nom rub
100 chaussette rose 1
101 chaussette verte 1
102 pantalon court 2
.
.
.

dh
 
WRInaute accro
Ok merci je ne sais pas si j'ai tout bien compris mais je vais essayer.
Et pour la génération de l'affichage je dois faire comment ?
Merci encore.
 
WRInaute impliqué
Voilà un exemple.
Ca sélectionne les articles dans l'ordre inverse de leur création (si ton id est auto incrémenté), et les rubriques sont classées par ordre alphabétique.
Volontairement, les rubriques sans articles ne s'afficheront pas.
Je n'ai pas testé le code que je donne ci-dessous, il y aura peut-etre des erreurs mais c'est pour te montrer le principe.

Code:
$sql = "SELECT a.nom, r.nom AS rubrique FROM articles a, rubriques r WHERE a.idrubrique = r.id ORDER BY a.id DESC, r.nom ASC";
$results = mysql_query($sql) or die ($sql.'<br>'.mysql_error($val) );

$lastRubname = '';
$inList = false;
while ($row = mysql_fetch_assoc($results) {
   if ($row['rubrique'] != $lastRubName) {
      if ($inList) echo('</ul>');
      echo('<h2>'.$row['rubrique'].'</h2>');
      $row['rubrique'] = $lastRubName;
   }
   if (!$inList) {
      echo('<ul>');
      $inList = true;
   }
   echo('<li>'.$row['nom'].'</li>');
}
if ($inList) echo('</ul>');

Bon, c'est assez crade mais c'est pour faire le truc sur peu de lignes et avec une seule requête MySQL.
Note que ce type de génération de HTML, normalement je déteste : ce que je fais la plupart du temps, c'est que je me construit des objets, c'est bien plus logique, et ça permet d'éviter de faire des boucles avec des if, comme ci-dessus.
 
WRInaute accro
Ok merci.
Si c'est crade, il n'y a pas une solution "propre" ?
Ou p-e que je n'aurais pas du organiser mes tables comme ça ?
Je suis ouvert à tout : je ne connasi rien en mysql :D

Merci à tous !
 
WRInaute impliqué
Volontairement, les rubriques sans articles ne s'afficheront pas.
Tiens bah si tu veux tout afficher, tu peux utiliser le principe de dh : un bon LEFT JOIN des familles et au lit ;-)
Par contre il faudra rajouter des tests à l'affichage... c'est un peu pour ça que j'ai préféré éviter cette technique pour mon exemple ;-)
 
WRInaute impliqué
Si c'est crade, il n'y a pas une solution "propre" ?
Au niveau de mysql c'est une structure correcte.
C'est au niveau de mon principe d'affichage que c'est naze.
Normalement il faut arriver à une structure d'affichage comme ça :
boucle rubriques {
boucles articles {
}
}

pour que ça reflète le code HTML. Pour ça il faut que tu organises tes données avant de passer à l'affichage, mais ça sort du cadre de ta question et je n'ai pas le courage de faire un cours de programmation ici. ;-)
 
Discussions similaires
Haut