prb de requette

prb de requette - SQL/NoSQL - Programmation

Marsh Posté le 19-07-2004 à 16:01:36    

bonjour
je voudrais afficher toute les personnes qui ont le champ PG_PUB à 'Y' et prendre 1 article par les 9 disponibles
la requette tourne à 90% sauf quelle me selectionne des fois plusieurs articles de la meme personne
ou je me suis trompé
 
 <table border="0" summary="">
 <tr>
  <td align="center" colspan="2">&nbsp;</td>
 </tr>
 <?
 session_destroy();
 $query="select ID_USER from USERS where PG_PUB <> 'NULL'";  
   $ok = fm($query);
   $nbr = mysql_num_rows($ok);
 list($ID_USER)=mysql_fetch_row($ok);
   mysql_free_result($ok);
 
 echo"<table border=\"0\" align=\"center\" width=\"500\" cellspacing=\"0\">";
 echo"<tr>";
 echo"<td align=\"center\" colspan=\"3\" bgcolor='#c1d001'><b>NOS COUPS DE COEUR </b></td>";
 echo"</tr>";
 
 $query = "select distinct ARTICLE.ID_USER,RAISON,PHOTO,PG_PUB from ARTICLE,USERS ";
 $query .= "where USERS.PG_PUB != 'NULL' ";
 $query .= "and ARTICLE.ID_USER=USERS.ID_USER ";
 $query .= "ORDER BY RAND() LIMIT $nbr";  
 $pub = fm($query);
 //echo "<br><center>[query : ".$query."]</center>";
 $ligne=ceil($nbr/3);
 for($i=0;$i<$ligne;$i++)
      {
      echo"<tr>";
      for ($j=0;$j<3;$j++)
          {
    list($ID_USER,$RAISON,$PHOTO,$PG_PUB)=mysql_fetch_row($pub);
        if($PHOTO != "" )
      {
    echo"<td align=\"center\" class=\"raison\"><br>";
    echo"<a href=\"visu.php?action=galerie&expo=aff&page=Y&id_user=$ID_USER&pg_pub=$PG_PUB\">";
    echo"<img src=\"tmp/$PHOTO\" border=\"0\" width=\"150\" ></a><br>$RAISON";
    echo"</td>";
    }
    else
      {
      echo"<td align=\"center\">&nbsp;</td>";
      }
          }
        $l=0;
        $j=0;
       echo"</tr>";
       }
     echo"<tr><td align=\"center\" colspan=\"3\" bgcolor='#c1d001'>&nbsp;</td></tr>";  
       echo"</table>";
 ?>  
 <tr>
  <td align="center" colspan="2"><?foot();?></td>
 </tr>
</table>

Reply

Marsh Posté le 19-07-2004 à 16:01:36   

Reply

Marsh Posté le 20-07-2004 à 21:08:45    

1) select ID_USER from USERS where PG_PUB <> 'NULL'
C'est pas parce que ton champs PG_PUB n'est pas égal à 'NULL' qu'il contient forcément 'Y'. De plus, ca te ferais mal d'utilise la valeur null plutôt que 'NULL' ?
 
2) Quand on souhaite de l'aide sur une requête et qu'on veut des réponses, c'est mieu de faire l'effort minimum de ne poster que la/les requête/s qui chie/nt
 
3) where USERS.PG_PUB != 'NULL'
Comme le 1). De plus, utilise <> ou !=, mais faut choisir, mélanger les syntaxes possibles à tout bout de champs c'est ruiner la possibilité de faire de la maintenance par la suite.
 
4) select distinct ARTICLE.ID_USER,RAISON,PHOTO,PG_PUB from ARTICLE,USERS  
Préfixer avec le nom des tables quand tu fais une jointure, ça ne sert pas qu'à éviter de planter lors de l'exécution de la requête quand des champs sont présents dans plusieurs tables, ça sert aussi à une personne qui ne connaît pas ton modèle des données de comprendre la requête. Après ces 4 remarques un peu sèches, je voulais te filer un coup de main (pour pas passer pour un connard), mais là tu me coupes le souffle, ça me lourde de passer 30 minutes à réinventer ton modèle des données. Je répondrai plus tard si je m'emmerde, dans la soirée.

Reply

Marsh Posté le 21-07-2004 à 06:35:45    

bonjour
non non ne t'inquiète pas "tu ne passera pas pour un connard" à mes yeux je pense que toutes remarques même un peux séches est bonne à prendre c'est comme ca que l'on avance.
 
1/ pour ta 1er remarque  
'NULL' lors de la creation de la table mysql à mi NULL d'habitude je laisse la champ vide (1er connerie de ma part)
2/ pour ta 2em remarque  
j'ai pense qu'il fallais mieux poster le bout de code entier. maintenant je sais qu'il faut mieux poster que la requette qui merde.
3/ pour ta 3em remarque  
j'ai pas fais gaffe........
4/ pour ta 4em remarque  
aurait il fallu que je joingne la structure des tables utilisées pour la requette?
 
salutation a+ gilles
 

Reply

Marsh Posté le 21-07-2004 à 20:45:23    

4/ oui, ne serait-ce que la liste des champs utilisés par la requête.
 
Bon, vu que t'as pal mal pris mes remarques, je vais faire un effort ce soir, j'ai complètement zappé de repasser sur le forum hier soir, et vu que personne n'a eu la courtoisie de répondre à ton message, je ne vais pas te laisser dans la merde ;)
 

Reply

Marsh Posté le 21-07-2004 à 21:07:53    

Dans un premier temps, ta requête ne renvoie pas du tout ce que tu cherches à faire.
 
Retourne les "nombre_utilisateur" premiers articles de ta table, sans te soucier si tu as tous tes utilisateurs... et donc des "doublons" pour certains utilisateurs.
 
Je te conseille de faire ça :
 


 <table border="0" summary="">  
 <tr>  
  <td align="center" colspan="2">&nbsp;</td>  
 </tr>  
 <?  
 session_destroy();  
 $query="select ID_USER from USERS where PG_PUB = 'Y' ORDER BY RAND() ";    
   $ok = fm($query);  
   $nbr = mysql_num_rows($ok);  
 
 $ligne=ceil($nbr/3);  
 for($i=0;$i<$ligne;$i++)  
      {  
      echo"<tr>";  
      for ($j=0;$j<3;$j++)  
          {  
list($ID_USER)=mysql_fetch_row($ok);
 
 $query = "select distinct ARTICLE.ID_USER,RAISON,PHOTO from ARTICLE ";  
 $query .= "where ARTICLE.ID_USER=$ID_USER ";  
 $query .= " ORDER BY RAND() LIMIT 1";  
 $pub = fm($query);  
 //echo "<br><center>[query : ".$query."]</center>";  
    list($RAISON,$PHOTO,$PG_PUB)=mysql_fetch_row($pub);  
        if($PHOTO != "" )  
      {  
    echo"<td align=\"center\" class=\"raison\"><br>";  
    echo"<a href=\"visu.php?action=galerie&expo=aff&page=Y&id_user=$ID_USER&pg_pub=$PG_PUB\">";  
    echo"<img src=\"tmp/$PHOTO\" border=\"0\" width=\"150\" ></a><br>$RAISON";  
    echo"</td>";  
    }  
    else  
      {  
      echo"<td align=\"center\">&nbsp;</td>";  
      }  
          }  
        $l=0;  
        $j=0;  
       echo"</tr>";  
       }  
 
   mysql_free_result($ok);  
   
 echo"<table border=\"0\" align=\"center\" width=\"500\" cellspacing=\"0\">";  
 echo"<tr>";  
 echo"<td align=\"center\" colspan=\"3\" bgcolor='#c1d001'><b>NOS COUPS DE COEUR </b></td>";  
 echo"</tr>";  
 
 
 
     echo"<tr><td align=\"center\" colspan=\"3\" bgcolor='#c1d001'>&nbsp;</td></tr>";    
       echo"</table>";  
 ?>  
 <tr>  
  <td align="center" colspan="2"><?foot();?></td>  
 </tr>  
</table>


 
Ceci dit, j'ai pour ainsi dire jamais fait de PHP, donc je ne suis dûr de rien niveau syntaxe. Par contre c'est l'algo ça suivre.
 
Avec un SGBD plus évolué tu aurais pu t'en sortir avec une seule requête contenant une sous-requête, mais là c'est pas possible.
Une autre solution t'aurais permit aussi de tout retourner avec une requête unique et un petit traîtement PHP, mais le caractère aléatoire du tri rends impossible ce type de fonctionnement.
Par conséquent, je ne vois pas d'autre solution que celle-ci, qui est bien minable (si t'as 100 000 utilisateurs, tu vas éxécuter 100 001 requête pour afficher la page, ce qui n'est pas terrible.


Message édité par Arjuna le 21-07-2004 à 21:08:25
Reply

Marsh Posté le 21-07-2004 à 21:08:59    

PS: l'indentation est pourrie, je me suis contenté de faire des copier/coller de ton code, vu que je ne sais pas écrire une ligne de PHP :D

Reply

Marsh Posté le 23-07-2004 à 06:08:06    

bonjour
 
excuse du retard....
merci pour ta reponse, je testesterais les modifs se week end, pour l'indendation a due merdé suite à mon copie colle, elle est plus clean sur l'original
 
merci je te tiens au courant des modifs  
 
gilles

Reply

Sujets relatifs:

Leave a Replay

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