Une addition sélective...

Une addition sélective... - PHP - Programmation

Marsh Posté le 18-01-2008 à 14:28:26    

Salut à tous,
Je vais essayer de vous expliquer au mieux mon problème...
J'ai déjà créé 2 tables:
id_joueur  nom      prénom
1            dupont   michel
2            durant    alain
3            dufour    pierre
 
idjoueur  points_perso   date  
2            50               10 janvier
3            30               11 janvier
1            40               9 janvier
3            10               13 janvier
1            20               14 janvier
2            40               14 janvier
 
J'ai créé une requête pour avoir la somme des points de chaque joueur en faisant:

Code :
  1. <?
  2. $query = "SELECT nom, sum(pointsperso) FROM joueurs,points where idjoueur=id_joueur GROUP BY idjoueur ORDER BY nom";
  3. $result = mysql_query($query) or die("Query failed" );
  4. while ($line = mysql_fetch_assoc($result)) {
  5.     echo "\t<tr>\n";
  6.     foreach ($line as $col_value) {
  7.         echo "\t\t<td>$col_value</td>\n";
  8.     }
  9.     echo "\t</tr>\n";
  10. }
  11. echo "</table>\n";
  12. ?>


 jusque là, pas de soucis.
J'ai donc:
Nom:   Points perso:  
Michel    60
Alain      90
Pierre     40
 
Sachant que Pierre fait partie de l'équipe de Alain et que Alain et Pierre font partie de l'équipe de Michel (une pyramide quoi), je voudrais arriver à additionner les points des membres de l'équipe (sans le chef d'équipe puis avec dans la colonne suivante)
Donc il me reste à faire ce qui est en rouge:
 
Nom:   Points perso:  Points équipe seule: Points équipe complète:
Michel    60                         130                  190
Alain      90                         40                    130
Pierre     40                                                40
 
je pense que je devrais avoir:

Code :
  1. <?
  2. $query = "SELECT nom, sum(pointsperso), $equipeseule, $equipecomplete FROM joueurs,points where idjoueur=id_joueur GROUP BY idjoueur ORDER BY nom";
  3. $result = mysql_query($query) or die("Query failed" );
  4. while ($line = mysql_fetch_assoc($result)) {
  5.     echo "\t<tr>\n";
  6.     foreach ($line as $col_value) {
  7.         echo "\t\t<td>$col_value</td>\n";
  8.     }
  9.     echo "\t</tr>\n";
  10. }
  11. echo "</table>\n";
  12. ?>


mais je ne sais pas du tout vers quel principe me diriger pour faire ce calcul...
Je pensais aux switch, mais je ne vois pas comment faire.
J'espère avoir été bien clair, mais pouvez-vous m'aider?

Reply

Marsh Posté le 18-01-2008 à 14:28:26   

Reply

Marsh Posté le 18-01-2008 à 16:21:33    

A mon avis, il faudrait rajouter dans ta table les colonnes : id_equipe, is_leader
 
Ensuite avec ton SQL, tu requetes pour avoir :

  • total par id_groupe si is_leader = No => equipe seule
  • total par id_groupe => equipe complète


Peut être y-a-til de meilleure solution...


Message édité par babasss le 18-01-2008 à 16:21:52

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 18-01-2008 à 21:03:53    

Par facilité, je n'ai pas besoin des points de l'équipe seule, mais uniquement de l'équipe entière.
J'ai donc le code suivant:

Code :
  1. <?
  2. $query = "SELECT nom, sum(pointsperso), $equipecomplete FROM joueurs,points where idjoueur=id_joueur GROUP BY idjoueur ORDER BY nom";
  3. $result = mysql_query($query) or die("Query failed" );
  4. while ($line = mysql_fetch_assoc($result)) {
  5.     echo "\t<tr>\n";
  6.     foreach ($line as $col_value) {
  7.         echo "\t\t<td>$col_value</td>\n";
  8.     }
  9.     echo "\t</tr>\n";
  10. }
  11. echo "</table>\n";
  12. ?>


Mais je ne vois toujours pas comment arriver à avoir le résultat de l'équipe complète DE CHAQUE JOUEUR!
Je sais avoir les points individuel de chaque joueur et de là, je sais avoir le résultat de l'équipe complète. Cela se termine +/- comme ceci:

Code :
  1. $olivier=$somme2+$somme3+$somme4;
  2. $marc=$somme2+$somme3;
  3. $steve=$somme2+$somme3+$somme4+$somme5;


Mais comment permettre l'affichage dans $equipecomplete et que cela corresponde bien à chaque id_joueur??? Je pensais aux switch mais je ne vois pas comment m'y prendre...
Merci d'avance!

Reply

Marsh Posté le 19-01-2008 à 11:57:35    

En fait, tu peux obtenir ton résultats seulement en SQL :
 
Table : joueurs
id_joueur       nom     id_groupe
   1             michel        1
   2              alain         1
   3             pierre         1
   4            jacques       2
 
Table : points
id_joueur points_perso      date
    2        50           10 janvier
    3        30           11 janvier
    1        40           9 janvier
    3        10           13 janvier
    1        20           14 janvier
    2        40           14 janvier
    4        50           15 janvier
 
Si tu fais un tout bête :  

Code :
  1. SELECT nom, sum( points_perso )
  2. FROM joueurs INNER JOIN points ON joueurs.id_joueur = points.id_joueur
  3. GROUP BY points.id_joueur ORDER BY nom


(Au passage il est judicieux de noter qu'il est préférable de faire un "INNER JOIN" que un "WHERE A = B" )
Tu obtiens :
nom       sum( points_perso )
alain          90
jacques        50
michel         60
pierre         40
 
Maintenant si tu fais :

Code :
  1. SELECT nom, sum( points_perso ) , joueurs.id_groupe AS IDGROUPE, (SELECT sum( points_perso ) FROM points INNER JOIN joueurs ON points.id_joueur = joueurs.id_joueur WHERE joueurs.id_groupe = IDGROUPE) AS equipe_complete
  2. FROM points INNER JOIN joueurs ON points.id_joueur = joueurs.id_joueur
  3. GROUP BY points.id_joueur ORDER BY nom


Tu obtiens :
nom         sum( points_perso )   IDGROUPE   equipe_complete
alain                90                       1              190
jacques            50                      2               50
michel             60                       1               190
pierre              40                       1               190
 
Explication :

Code :
  1. SELECT nom, sum( points_perso ) , joueurs.id_groupe AS IDGROUPE, (SELECT sum( points_perso ) FROM points INNER JOIN joueurs ON points.id_joueur = joueurs.id_joueur WHERE joueurs.id_groupe = IDGROUPE) AS equipe_complete
  2. FROM points INNER JOIN joueurs ON points.id_joueur = joueurs.id_joueur
  3. GROUP BY points.id_joueur ORDER BY nom


Dans ce SQL, j'ai demandé 4 valeurs : nom, sum(points_perso), le champ id_groupe que j'ai rennomé en IDGROUPE (afin de ne pas le confondre avec le id_groupe de la sous-requête) et une valeur issue d'une sous-requête que je renomme en equipe_complete

Code :
  1. SELECT sum( points_perso ) FROM points INNER JOIN joueurs ON points.id_joueur = joueurs.id_joueur WHERE joueurs.id_groupe = IDGROUPE


Dans la sous requête, j'ai demandé la somme des points_perso aggrégé par id_groupe pour le id_groupe égal au IDGROUPE de l'id_joueur de la requête principale.
NB : La colonne IDGROUPE est indispensable et elle ne peut pas être placé aprés la sous-requête
 
En espérant avoir été assez clair...


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 19-01-2008 à 14:45:51    

Salut,  
Tout d'abord, merci, parce que c'est balaise tout ce que tu racontes!
On avance, mais ce n'est pas tout à fait ça que je veux. C'est un peu plus compliqué.
Je m'explique...
Il faut bien visualiser la structure. c'est le principe d'une pyramide, en fonction du grade, les points changent. Plus on est en haut, plus on accumule les points.
             Michel
           /         \
     Alain           Marie
     /    \                 \
 Pierre  Steve         Sophie
    /                     /        \
jacques          Marc        Louis
                     /
                  Olivier
 
Voilà une situation possible.
Je voudrais donc avoir par exemple, les points de Michel, qui compteraient ses points perso + tous les points des gars qui sont en dessous.
Jacques n'aurait que ses points perso.
Sophie aurait ses points perso+ ceux de Marc Louis et Olivier.
Alain aurait ses points perso + ceux de Pierre Steve et Jacques.
etc.
 
La solution n'est elle pas de mettre des conditions?  
Comment s'y prendre?
Merci de ne pas me laisser tomber!!!

Reply

Marsh Posté le 19-01-2008 à 18:26:50    

Ce que je ferais :

  • Je rajouterai à chacun dans la table joueurs un champ "id hierarchy" pour récupérer la personne au-dessus hiérarchiquement
  • Je calcule les personnes qui dépendent de chacun
  • Après avec un IN dans le SQL tu récupéres le nombre de points de la branche
  • Tu affiches le résultat


Cela donne :

Code :
  1. // tu parcours les joueurs pour reconstruire leurs aborescence  
  2. for ($i = 1; $i <= $nb_joueurs; $i++)
  3. {
  4.  $level = $i;
  5.  $resultat_temp = $level;
  6.  //tu parcours les niveaux hiérarchiques pour voir les dépendances de chacun
  7.  for ($j = 0; $j < $niv_hierarchy; $j++)
  8.  {
  9.   $sql_hierarchy1 = "SELECT id_joueur FROM `joueurs` WHERE id_hierarchy in ($level)";
  10.   $mysql_hierarchy1 = mysql_query($sql_hierarchy1);
  11.   $temp = '';
  12.   while (@$row_hierarchy1 = mysql_fetch_array($mysql_hierarchy1, MYSQL_NUM))
  13.   {
  14.    $temp .= ','.$row_hierarchy1[0];
  15.   }
  16.   $resultat_temp .= $temp;
  17.   $level = trim(substr($temp,1,strlen($temp)));
  18.  }
  19.  //tu stockes les résultats
  20.  $resultat[$i] = trim($resultat_temp);
  21. }
  22. // affichage des résultats
  23. for ($i = 1; $i <= $nb_joueurs; $i++)
  24. {
  25.  $sql_resultat = "SELECT nom, sum( points_perso ) AS points, (
  26.       SELECT sum( points_perso )
  27.       FROM points WHERE id_joueur IN ( ".$resultat[$i]." )
  28.       ) AS points_equipe
  29.       FROM points
  30.       INNER JOIN joueurs ON points.id_joueur = joueurs.id_joueur
  31.       INNER JOIN hierarchy ON hierarchy.id_joueur = joueurs.id_joueur
  32.       WHERE joueurs.id_joueur = ".$i."
  33.       GROUP BY points.id_joueur
  34.       ORDER BY nom";
  35.  $mysql_resultat = mysql_query($sql_resultat);
  36.  $result_resultat = mysql_fetch_row($mysql_resultat);
  37.  echo $result_resultat[0].' - '.$result_resultat[1].' - '.$result_resultat[2].'<br>';
  38. }



---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 20-01-2008 à 19:56:33    

Tu pourrais aussi faire comme ça si tu n'ajoutes pas souvent des joueurs dans ta table :
 

                19-Michel-0
                /          \
        18-Alain-11       10-Marie-1
       /          \             \
 17-Pierre-14  13-Steve-12    9-Sophie-2
    /                           /     \
16-jacques-15              8-Marc-5    4-Louis-3
                               /
                         7-Olivier-6


 
dans ta table tu aurais


nom                     petit     grand
michel                    0          19
marie                     1          10
sophie                    2           9
louis                       3           4
marc                      5           8
olivier                     6           7
alain                      11          18
steve                     12          13
pierre                     14          17
jacques                  15          16


 
 
donc pour avoir les points de marie et de tous ceux qui sont en dessous de marie, tu additionnes simplement les points des joueurs joueurs dont "petit >= 1 et grand <= 10"
 
Le problème de cette façon de faire est que chaque fois que tu ajoutes un joueur dans ta liste, il faut recalculer toutes les valeurs de "petit" et "grand". Mais si tu ne dois pas souvent ajouter du monde, c'est bon :)
 
 
edit: en fait je pense que c'est assez facile d'ajouter quelqu'un mais que c'est plus chiant pour déplacer quelqu'un. Mais je n'ai jamais utilisé ce truc donc je ne sais pas vraiment :p


Message édité par art_dupond le 20-01-2008 à 20:03:02

---------------
oui oui
Reply

Marsh Posté le 27-01-2008 à 21:15:47    

babasss a écrit :

Ce que je ferais :

  • Je rajouterai à chacun dans la table joueurs un champ "id hierarchy" pour récupérer la personne au-dessus hiérarchiquement
  • Je calcule les personnes qui dépendent de chacun
  • Après avec un IN dans le SQL tu récupéres le nombre de points de la branche
  • Tu affiches le résultat


Cela donne :

Code :
  1. // tu parcours les joueurs pour reconstruire leurs aborescence  
  2. for ($i = 1; $i <= $nb_joueurs; $i++)
  3. {
  4.  $level = $i;
  5.  $resultat_temp = $level;
  6.  //tu parcours les niveaux hiérarchiques pour voir les dépendances de chacun
  7.  for ($j = 0; $j < $niv_hierarchy; $j++)
  8.  {
  9.   $sql_hierarchy1 = "SELECT id_joueur FROM `joueurs` WHERE id_hierarchy in ($level)";
  10.   $mysql_hierarchy1 = mysql_query($sql_hierarchy1);
  11.   $temp = '';
  12.   while (@$row_hierarchy1 = mysql_fetch_array($mysql_hierarchy1, MYSQL_NUM))
  13.   {
  14.    $temp .= ','.$row_hierarchy1[0];
  15.   }
  16.   $resultat_temp .= $temp;
  17.   $level = trim(substr($temp,1,strlen($temp)));
  18.  }
  19.  //tu stockes les résultats
  20.  $resultat[$i] = trim($resultat_temp);
  21. }
  22. // affichage des résultats
  23. for ($i = 1; $i <= $nb_joueurs; $i++)
  24. {
  25.  $sql_resultat = "SELECT nom, sum( points_perso ) AS points, (
  26.       SELECT sum( points_perso )
  27.       FROM points WHERE id_joueur IN ( ".$resultat[$i]." )
  28.       ) AS points_equipe
  29.       FROM points
  30.       INNER JOIN joueurs ON points.id_joueur = joueurs.id_joueur
  31.       INNER JOIN hierarchy ON hierarchy.id_joueur = joueurs.id_joueur
  32.       WHERE joueurs.id_joueur = ".$i."
  33.       GROUP BY points.id_joueur
  34.       ORDER BY nom";
  35.  $mysql_resultat = mysql_query($sql_resultat);
  36.  $result_resultat = mysql_fetch_row($mysql_resultat);
  37.  echo $result_resultat[0].' - '.$result_resultat[1].' - '.$result_resultat[2].'<br>';
  38. }




Salut babasss,
J'ai du mal à bien comprendre tout ton raisonnement...
En faisant comme ca, cela fonctionnera bien tant pour Alain que pour Marie?
Pour commencer, que dois-je mettre dans id_hierarchy? 1,2,3...? un chiffre différent pour chaque en commençant par un à celui qui se trouve au-dessus?
Pour le reste, j'ai copié ce que tu as fait, mais je n'arrive à rien afficher. Je dois modifier qqch?
Merci d'avance...
 

Reply

Marsh Posté le 28-01-2008 à 05:40:41    

Reply

Marsh Posté le 28-01-2008 à 12:54:06    

bingojm a écrit :


Pour commencer, que dois-je mettre dans id_hierarchy? 1,2,3...? un chiffre différent pour chaque en commençant par un à celui qui se trouve au-dessus?


Comme je le disais dans mon post : "un champ "id hierarchy" pour récupérer la personne au-dessus hiérarchiquement". Donc pour Michel tu mets 0, pour Marie tu mets l'id de Michel, pour Sophie tu mets l'id de Marie....

bingojm a écrit :


Pour le reste, j'ai copié ce que tu as fait, mais je n'arrive à rien afficher. Je dois modifier qqch?


Peut être le nom des champs et/ou le nom des tables sql qui ne correspondent pas entre ton modèle et le mien...


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Sujets relatifs:

Leave a Replay

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