essai de group by (ne fonctionne pas vraiment)

essai de group by (ne fonctionne pas vraiment) - PHP - Programmation

Marsh Posté le 19-05-2006 à 15:06:54    

J'ai deux tables categorie (champs:id_cat et cat) et lien champs (id_lien, lien, num_cat)
 
Une catégorie peux avoir plusieurs liens.
 
ma requête:

Citation :


$sql="SELECT * FROM cat JOIN lien WHERE num_cat=id_cat GROUP BY cat";


 
Ensuite je veux afficher tout ça:

Citation :


 echo "<h3>".$val["cat"]."</h3>\n";  
          echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n";
            while ($val=mysql_fetch_array ($result))
              {
          echo "<h3>".$val["cat"]."</h3>\n";
          echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n"
}


ça marche mais je n'ai qu'un seul lien par catégorie qui s'affiche... et là je ne vois pas ce qui ne marche pas!!
help ! please!
 

Reply

Marsh Posté le 19-05-2006 à 15:06:54   

Reply

Marsh Posté le 19-05-2006 à 15:32:50    

Ce que tu mets avant la boucle ne peut pas s'afficher correctement, puisque avant cette boucle, $val ne possède pas de valeurs (en tout cas pas les bonnes).

Code :
  1. while ($val=mysql_fetch_array ($result)) {
  2.           echo "<h3>".$val["cat"]."</h3>\n";
  3.           echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n"
  4. }


Message édité par Djebel1 le 19-05-2006 à 15:33:14
Reply

Marsh Posté le 19-05-2006 à 15:39:13    

en fait j'ai mal recopié mon code mais j'ai :

Citation :


$sql="SELECT * FROM cat JOIN lien WHERE num_cat=id_cat GROUP BY cat";
$result=mysql_query ($sql);
        $val=mysql_fetch_array ($result);
echo "<h3>".$val["cat"]."</h3>\n";  
          echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n";
            while ($val=mysql_fetch_array ($result))
              {
          echo "<h3>".$val["cat"]."</h3>\n";
          echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n"
}


 
pour que le premier enregistrment de la base puisse apparaitre si je ne fais que la boucle il commence au deuxième.
mais là n'est pas le problème... je n'ai toujours qu'un lien par catégorie et ça m'énerve

Reply

Marsh Posté le 19-05-2006 à 15:40:11    

en faisant un group by cat , c'est toi qui demande de n'avoir qu'un seul resultat par cat


---------------

Reply

Marsh Posté le 19-05-2006 à 15:42:42    

>si je ne fais que la boucle il commence au deuxième
bah non pas du tout. Si tu fais que la boucle il commence évidemment au premier. mysql_fetch_array() déplace un pointeur sur les résultats de ta requête. Ce pointeur est au départ placé au début des résultats (et tu peux même le réinitialiser si ça te chante, mais bon là t'en as pas besoin).
 
Tout ça pour dire que, si, la boucle commence au premier résultat. Donc tu vires ce qu'il y a entre le mysql_query et la boucle.
 
Le problème est peut-être tout simplement que ta requête ne renvoit que un seul résultat, non ?
edit : grilled


Message édité par Djebel1 le 19-05-2006 à 15:43:02
Reply

Marsh Posté le 19-05-2006 à 18:38:38    

Si je ne fais pas un group by cat il réécris la catégorie autant de fois qu'il y a de lien et ça je ne veux pas...
Du style:
Cat1
Lien1
Cat 1
Lien 2
Cat 2
lien 1a
ect...
Ce que je voudrais c'est:  
cat 1
lien1
lien2
Cat 2
lien1a
 
Bref je ne vois pas trop comment améliorer la chose... S'il y a quelqu'un qui voit ....
                 

Reply

Marsh Posté le 19-05-2006 à 18:46:43    

pour la boucle, Djebel1, t'as raison mais y'a toujours le pb avec plusieurs lien par cat

Reply

Marsh Posté le 19-05-2006 à 19:12:14    

euh à mon avis ça te renvoie plutôt un truc genre :  
Cat1 | Lien 1
Cat1 | Lien 2
Cat2 | Lien 1
 
donc tu rajoute une clause order by cat_id dans ta requête, ensuite c'est super simple à gérer.


Message édité par Djebel1 le 19-05-2006 à 19:12:37
Reply

Marsh Posté le 19-05-2006 à 19:28:05    

$sql="SELECT * FROM cat JOIN lien WHERE num_cat=id_cat GROUP BY cat";  
 
tu proposes de faire :
$sql="SELECT * FROM cat JOIN lien WHERE num_cat=id_cat ORDER BY id_cat";  
mais c'est là que j'ai :
Cat1 | Lien 1
Cat1 | Lien 2
Cat2 | Lien 1  
 et ce n'est pas le résultat souhaité...
Je suis sur que c'est super simple mais je n'y arrive pas!Je cale

Reply

Marsh Posté le 19-05-2006 à 20:06:06    

C'est très bien, ce que ça te renvoie, tu peux pas avoir ton résultat autrement... Tu testes quand $val['id_cat'] change, comme ça tu sais quand ça passe à la prochaine catégorie.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 19-05-2006 à 20:06:06   

Reply

Marsh Posté le 19-05-2006 à 20:17:36    

ben là tu me poses une colle car je ne vois pas du tout comment tester si  
$val['id_cat'] change!
ça serait un truc comme  
if($val['id_cat']!=$val['num_cat'])
... vraiment je ne vois pas

Reply

Marsh Posté le 19-05-2006 à 20:21:59    

$old_id_cat = -1;
 
while ($val = ...) {
   if ($val['id_cat'] != old_id_cat) {
      // nouvelle cat
   }
   else {
      // même cat
   }
   $old_id_cat = $val['id_cat'];
}


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 19-05-2006 à 20:22:42    

Code :
  1. $temp = null;
  2. $x = 0;
  3. while ($val = mysql_fetch_array($result)) {
  4.     if ($x > 0 && $val['id_cat'] != $temp) {
  5.         ...
  6.     }
  7.     $temp = $val['id_cat'];
  8.     $x++;
  9. }


par exemple ...
 
edit : olol le timing :p


Message édité par Djebel1 le 19-05-2006 à 20:23:09
Reply

Marsh Posté le 19-05-2006 à 20:51:50    

Je me sens vraiment le plus nul du monde car je ne dois pas savoir mettre en place vos scripts...
 
selon Djebel1
Affiche tout en double
 

Citation :


$temp = null;
        $x = 0;
   
      while ($val = mysql_fetch_array($result)) {
   
         if ($x > 0 && $val['id_cat'] != $temp) {
               echo "<h3>".$val["cat"]."</h3>\n";
   echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n";
           }
            $temp = $val['id_cat'];
            $x++;
         }  


 
selon sielfried
ne change rien à l'affichage

Citation :


while ($val = $val=mysql_fetch_array ($result)) {
 
           
   if ($val['id_cat'] != old_id_cat) {
   echo "<h3>".$val["cat"]."</h3>\n";
   echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n";
      // nouvelle cat
   }
   else {
   
     echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n"; // même cat
   }
   $old_id_cat = $val['id_cat'];
   
   }

Reply

Marsh Posté le 19-05-2006 à 20:55:03    

old_id_cat => $old_id_cat...  
 
$val = $val => $val...


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 19-05-2006 à 21:10:02    

oh yessssssssssssssssssssss
merci sielfried!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
t'es trop bon

Citation :


$old_id_cat = -1;
while ($val = $val=mysql_fetch_array ($result)) {
 
           
   if ($val['id_catlien'] != $old_id_cat) {
   echo "<h3>".$val["cat"]."</h3>\n";
   echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n";
      // nouvelle cat
   }
   else {
   
     echo "<h3><a href=\"http://".$val["lien"]."\">".$val["lien"]."</a></h3>\n"; // même cat
   }
   $old_id_cat = $val['id_catlien'];
   
   }

Reply

Sujets relatifs:

Leave a Replay

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