Alléger ses requêtes mysql

Alléger ses requêtes mysql - PHP - Programmation

Marsh Posté le 11-01-2003 à 16:59:07    

C'est encore moi  :D  
 
J'ai une question qui porte sur mysql cette fois. Je dois faire une sorte de statistiques, et j'utilise des requêtes multiples. Enfin, plutôt, des réquêtes à l'intérieur d'une requête... Et je trouve ça hypra-lourd dans le genre. L'exemple simplifié du code ci-dessous :
 

Code :
  1. $query = "SELECT * FROM users";
  2. $result = mysql_query($query, $connection);
  3. while($row = mysql_fetch_row($result))
  4. {
  5.         $pseudo = $row[1];
  6.         .
  7.         .
  8.         .
  9.         $query2 = "SELECT * FROM posts WHERE pseudo='$pseudo'";
  10.         $result2 = mysql_query($query2, $connection);
  11.         $nbposts = mysql_num_rows($result2);
  12.  
  13.         $query3 = "SELECT * FROM subjects WHERE pseudo='$pseudo'";
  14.         $result3 = mysql_query($query3, $connection);
  15.         $nbsubjects = mysql_num_rows($result3);
  16.  
  17.         print("$pseudo, $nbposts, $nbsubjects" );
  18.         }


 
Comme je suis plutôt très moyen en Mysql, je me demandais s'il y avait une méthode pour regrouper toutes ses requêtes en une seule ?  :??:


---------------
gaymer's est la personne la plus formidable jamais rencontrée dans toute ma vie, je lui achèterais un makato et au moins les 4 news pourries quotidiennes qui vont avec
Reply

Marsh Posté le 11-01-2003 à 16:59:07   

Reply

Marsh Posté le 11-01-2003 à 17:13:40    

C'est sûrement faisable en réfléchissant bien avec du GROUP BY, le tout après une jointure de tes tables, mais ce que je te conseille de faire si tu souhaites alléger tes requêtes et que tu n'es pas trop limité par la place, c'est de stocker quelques données calculées.
 
En reprenant ton exemple, dans ta table users tu rajoutes les nbposts et nbsubjects, que tu n'oublies pas de mettre à jour quand il le faut.
 
Ainsi tu as une ou deux requêtes de mise à jour plus lors de l'ajout d'un topic ou post, mais à l'affichage ça devient beaucoup plus léger, avec une seule requête dans tous les cas.
 
C'est ce que je fais, en tout cas.


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

Marsh Posté le 11-01-2003 à 17:29:33    

:jap:  
 
Je n'avais pas pensé à cette solution !
 
Mais est-ce que quelqu'un pourrait tout de même me donner un exemple avec des GROUP BY, et des jointures de tables, car ce sont justement ce genre de notions mysql qui m'échapppent...


---------------
gaymer's est la personne la plus formidable jamais rencontrée dans toute ma vie, je lui achèterais un makato et au moins les 4 news pourries quotidiennes qui vont avec
Reply

Marsh Posté le 11-01-2003 à 17:31:47    

user.id = prend l'id de la table user :)
 
le group by j'aui du mal aussi :whistle:

Reply

Marsh Posté le 11-01-2003 à 17:43:31    

Voilà la requête que ça donnerait dans ton cas, si uniquement le nombre de posts par utilisateur t'intéressait :
 

SELECT U.*, COUNT(P.id) FROM users U, posts P WHERE U.pseudo = P.pseudo GROUP BY U.pseudo


 
(en admettant que "pseudo" soit bien le nom du champ pseudo dans ta table users, et "id" le champ clé primaire de ta table posts).
 
Je crois qu'il y'a une version plus "MySQL" de faire les jointures, mais il me semble que cela revient au même au final.
 
Par contre pour avoir également le nombre de sujets, je pense que ce serait bien plus compliqué, voire très difficilement faisable en une requête unique.


Message édité par sielfried le 11-01-2003 à 17:43:56

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

Marsh Posté le 11-01-2003 à 18:05:45    

Oki merci beaucoup  :)  
 
Je pense que je vais retenir la première méthode que tu m'as cité, je crois que c'est ce qu'il y a de mieux à faire tout comptes faits.


---------------
gaymer's est la personne la plus formidable jamais rencontrée dans toute ma vie, je lui achèterais un makato et au moins les 4 news pourries quotidiennes qui vont avec
Reply

Sujets relatifs:

Leave a Replay

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