[résolu] Requete MySQL : problème d'affichage par catégorie

Requete MySQL : problème d'affichage par catégorie [résolu] - SQL/NoSQL - Programmation

Marsh Posté le 30-11-2005 à 11:35:12    

Salut à tous  :hello:  
 
Je me suis jusqu'à maintenant contenté de créer des requêtes simples du genre SELECT avec classemment DESC ou ASC, dés fois même avec un WHERE.
 
Mais je bloque sur une requête et j'ai besoin de votre aide.
 
J'ai une table "user" qui contient les champs "noms", "prenom", "pseudo", "categorie", etc...  
 
Ce que je voudrais réaliser c'est une requete affichant la categorie en en-tête et le nom, le prenom et le pseudo se rapportant à cette categorie.
 
Comme par exemple :
 
Administrateur
   fafane84
Moderateurs
   bidule
   machin
   truc
Membres
   jules
   henri
   seb
 
J'ai donc essayé d'utiliser GROUP BY qui effectivement regroupe bine par catégorie, mais n'affiche qu'une seule ligne par categorie.
 
Voici le code où je suis resté bloqué :

Code :
  1. // on se connecte à MySQL et on séléctionne la base
  2. connecter($hote, $utilisateur, $pass, $database, $db);
  3. // on crée la requête SQL
  4. $sql = 'SELECT * FROM '.$prefix.'user GROUP BY categorie';
  5. // on envoie la requête
  6. $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
  7. // on fait une boucle qui va faire un tour pour chaque enregistrement
  8. while($data = mysql_fetch_assoc($req))
  9.     {
  10. // on affiche les informations de l'enregistrement en cours
  11.     echo "<h2>".$data['categorie']."</h2>\n<ul>\n<li>"
  12.     .$data['prenom']
  13.     ." "
  14.     .$data['nom']
  15.     ." "
  16.     .$data['pseudo']
  17.     ."</li>\n</ul>\n";
  18.     }
  19. // on ferme la connexion
  20. mysql_close();


 
Merci d'avance pour vos réponses et vos bons conseils.
 
[:fafane84]


Message édité par fafane84 le 01-12-2005 à 14:18:44

---------------
Mon Topic de Vente Hardware
Reply

Marsh Posté le 30-11-2005 à 11:35:12   

Reply

Marsh Posté le 30-11-2005 à 11:51:04    

Vu la structure de ta table tu vas pas pouvoir faire ça dans ta requete, c'est ton script php qui doit le faire.
 
Remplace ton while par:

Code :
  1. $prevCat = '';
  2. while($data = mysql_fetch_assoc($req)){
  3.    if ( $data['categorie'] != $prevCat){
  4.      // on affiche les informations de l'enregistrement en cours
  5.      print "<h2>",$data['categorie'],"</h2>";
  6.   }
  7.   print "\n<ul>\n<li>", $data['prenom'], " ", $data['nom'], " ", $data['pseudo'], "</li>\n</ul>\n";
  8.   $prevCat = $data['categorie'];
  9. }


Message édité par anapajari le 30-11-2005 à 11:51:59
Reply

Marsh Posté le 30-11-2005 à 12:32:16    

Merci de ta réponse  anapajari [:b-rabbit]  
 
Je viens d'essayer ton code, il m'a fallut remplacer les , par des . car sinon j'avais une parse error.
 
J'ai aussi retiré le GROUP BY dans la requete.
 
Voici dons le nouveau code :

Code :
  1. $prevCat = '';
  2. while($data = mysql_fetch_assoc($req)){
  3.    if ( $data['categorie'] != $prevCat){
  4.      // on affiche les informations de l'enregistrement en cours
  5.       print "<h2>".$data['categorie']."</h2>";
  6.    }
  7.    print "\n<ul>\n<li>". $data['prenom']. " ". $data['nom']. " ". $data['pseudo']. "</li>\n</ul>\n";
  8.    $prevCat = $data['categorie'];
  9. }


Mais cela ne marchais pas comme prévu, alors j'ai rajouté  ORDER BY categorie ASC dans ma requete et tout semble s'afficher comme souhaité.
 
 [:athome]


---------------
Mon Topic de Vente Hardware
Reply

Marsh Posté le 30-11-2005 à 13:36:50    

fafane84 a écrit :

Merci de ta réponse  anapajari [:b-rabbit]  
Je viens d'essayer ton code, il m'a fallut remplacer les , par des . car sinon j'avais une parse error.


 
C'est parce que j'avais bouletté et mis 'print' au lieu de 'echo'.
Pour l'anecdote, echo avec virgule est censé être un peu plus rapide que print avec concatenation.

Reply

Marsh Posté le 30-11-2005 à 16:22:16    

Arggggg !!! Quel idiot je suis !!!  :fou:  
 
Je pensais pouvoir régler ce problème facilement, une fois que l'affichage ce ferait comme il faut, mais je n'y arrive pas.
 
En fait le champs "categorie" de la table "user" est un champs numérique qui renvoie au champs "cat_id" de la table "categories".
 
Et donc par conséquent grâce au code de anapajari tout s'affiche comme je le voulais mais au lieu du libellé de la catégorie il y a un joli numéro  :(  
 
Comment relie-t-on des tables dans une requête MySQL ?
 
Comment puis-je faire pour faire correspondre l'affichage du numéro de la catégorie de la table "user" avec le libellé de la catégorie de la table "categories" ?
 
Merci d'avance pour votre aide.


---------------
Mon Topic de Vente Hardware
Reply

Marsh Posté le 01-12-2005 à 10:29:36    

Code :
  1. sql = 'SELECT * FROM user inner join categorie on ( user.categorie= categorie.cat_id)';
  2. // OU  
  3. sql = 'SELECT * FROM user, categorie  where user.categorie= categorie.cat_id';


Attention les deux requêtes ci-dessus ne te remonteront pas le user si il n'existe pas de categorie correspondate dans la table catégorie.
Si cela s'averait necessaire, renseigne toi sur les "jointures externes" ( outer join)

Reply

Marsh Posté le 01-12-2005 à 14:17:59    

Merci beaucoup  [:athome]


---------------
Mon Topic de Vente Hardware
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed