JeuWeb - Crée ton jeu par navigateur
[Test] Calculer les bonus d'un équipement - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Test] Calculer les bonus d'un équipement (/showthread.php?tid=1380)

Pages : 1 2


RE: [Test] Calculer les bonus d'un équipement - Sephi-Chan - 17-12-2007

Justement la ligne retournée est la même, avec ou sans la variable. C'est précisément pourquoi je demande son utilité, d'autant qu'elle n'est utilisée nulle part dans le reste de la requête.


RE: [Test] Calculer les bonus d'un équipement - Sephi-Chan - 17-12-2007

J'ai la classe, c'est tout.
MySQL te domine, moi pas.


Sephi-Chan, :love:


RE: [Test] Calculer les bonus d'un équipement - lanoix - 17-12-2007

Excuse-moi Sephi-Chan, j'avais mal lu, je pensais que tu voulais uniquement le résultat, le tout en une requête. Maintenant si je comprends bien ce que tu veux, c'est plutôt très simple...

Ca donnerait un truc du genre...
(NB: j'écris à la volée dans le text area du forum, donc ca ne tournera surement pas avec un c/c.)

Code :
$sql = 'SELECT seelies.see_id, equ_force, equ_endurance, see_force, see_endurance, equ_place
    FROM seelies
    LEFT JOIN Seelie_has_equipement ON seelies.see_id = Seelie_has_equipement.see_id
    LEFT JOIN equipements ON Seelie_has_equipement.equ_id = equipements.equ_id
    WHERE seelies.see_id = 1';

// ... Execultion du SQL, résultats dans $results

if(mysql_count($results) == 0) {
   throw new Exception('Seelie not found!');
}
$result = mysql_fetch_assoc($results);
$seelie[] = array();
$seelie['id'] = $result['see_id'];
$seelie['base_force'] = $seelie['force'] = $result['see_force'];
$seelie['base_endurance'] = $seelie['endurance'] = $result['see_endurance'];
$seelie['equipments'] = array();

while($result = mysql_fecth_assoc($results)) {
   $equip = array();
   $equip['place'] = $result['place'];
   $equip['force'] = $result['equ_force'];
   $equip['endurance'] = $result['equ_endurance'];
   $seelie['equipments'][] = $equip;

   $seelie['force'] += $equip['force'];
   $seelie['endurance'] += $equip['endurance'];
}

Tu sors de là avec un bel objet qui représente ta seelie et ses équipements... Il y a un overhead dans le select SQL en ce sens que si 20 équipements, tu sors 20 fois les mêmes données pour les 3 premières colonnes...

Et contrairement à la solution proposée avant, on n'effectue jamais de formatage direct dans sa fonction SQL. Même si ici ca parrait propre parce qu'on ne joue qu'avec des chiffres, le jour où tu dois jouer avec d'autre données (par exemple même ici la place, le nom de l'équipement...), ca devient bien moche...

Maintenant, on pousse plus loin, seconde solution si tu veux éviter cet overhead...

Code :
$sql = 'SELECT see_id, see_force as fforce, see_endurance as endurance, "" as place
    FROM seelies
    WHERE see_id = 1
UNION
SELECT see_id,  equ_force, equ_endurance, equ_place
    FROM equipements, Seelie_has_equipement
    WHERE equipements.equ_id = Seelie_has_equipement.equ_id
    AND Seelie_has_equipement.see_id = 1';

// ... Execultion du SQL, résultats dans $results

if(mysql_count($results) == 0) {
   throw new Exception('Seelie not found!');
}
$result = mysql_fetch_assoc($results);
$seelie[] = array();
$seelie['id'] = $result['see_id'];
$seelie['base_force'] = $seelie['force'] = $result['fforce'];
$seelie['base_endurance'] = $seelie['endurance'] = $result['endurance'];
$seelie['equipments'] = array();

while($result = mysql_fecth_assoc($results)) {
   $equip = array();
   $equip['place'] = $result['place'];
   $equip['force'] = $result['fforce'];
   $equip['endurance'] = $result['endurance'];
   $seelie['equipments'][] = $equip;

   $seelie['force'] += $equip['force'];
   $seelie['endurance'] += $equip['endurance'];
}

Elle est pas mal mais va t'ennuyer dès que tu vas vouloir récupérer + d'infos sur la seelie dans la même requête (genre son nom, sa classe...). Ou tu jours avec les colonnes (les deux selects doivent avoir le même nombre de colonnes, etc...)

Solution 3, pareil mais en faisant deux requêtes séparées, mais là pas besoin d'expliquer je crois...

Hope this helps.