PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#151 29-01-2012 17:44:29

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Je crois, mais je suis en train de tester en vrai
mais d'apres le code, je dirai que oui


if ($go_statut3 == TRUE){
/*********************************
 * On enregistres le classement à l'arrivée et attribue les gains (statut 3 et +)
 *  *********************************/

 // création de la table memory course
$requete="CREATE TABLE `m_course2` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `id_course` int(10) unsigned NOT NULL,
      `id_pet` int(10) unsigned NOT NULL,
      `dist_parcourue` DECIMAL(8,2) unsigned NOT NULL,
      `nbparticipants` tinyint(3) unsigned NOT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_course` (`id_course`),
      KEY `idx_pet` (`id_pet`)
    ) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci"
;
$result2 = mysql_query($requete);
if ($result2===false){throw new Exception("Erreur de creation de la table m_course2",E_USER_NOTICE);}    
     
  $sql7="INSERT INTO m_course2 (id_course, id_pet, dist_parcourue, nbparticipants)
      SELECT t1.id_course,t1.id_pet,calc_dist(t2.endurance,t3.duree,t4.puissance_min,t2.puissance,t3.duree) as dist_parcourue, t3.nbparticipants
      FROM course_participant AS t1
      LEFT JOIN pet AS t2 ON t1.id_pet=t2.id_pet
      LEFT JOIN course AS t3 ON t1.id_course=t3.id_course
      LEFT JOIN
        (SELECT t1.id_course AS courseid, t1.id_pet, MIN(t2.strengh+t2.agilite+t2.intelligence) as puissance_min
        FROM course_participant AS t1 left join pet as t2 on t1.id_pet=t2.id_pet GROUP BY t1.id_course) as t4 ON t1.id_course=t4.courseid  
      WHERE t3.statut=2
      ORDER BY dist_parcourue DESC"
;  
  $result7 = mysql_query($sql7);
if ($result7===false){throw new Exception("Erreur de remplissage de la table m_course2",E_USER_NOTICE);}
 

Je confirme.
Dans ma table course, j'ai 2 courses au statut 2
si je lance la requete pour insérer ce qui va bien dans m_course2, ca me remplis la table comme ca (ici avec 2 courses donc):
INSERT INTO `m_course2` (`id`, `id_course`, `id_pet`, `dist_parcourue`, `nbparticipants`) VALUES
(1, 7, 1, 359.83, 5),
(2, 7, 23, 319.90, 5),
(3, 7, 21, 139.50, 5),
(4, 7, 4, 119.83, 5),
(5, 10, 17, 99.88, 4),
(6, 10, 34, 99.72, 4),
(7, 7, 32, 99.50, 5),
(8, 10, 35, 99.17, 4),
(9, 10, 36, 99.17, 4);

Dernière modification par ebouilleur (29-01-2012 17:49:17)

Hors ligne

#152 29-01-2012 17:48:14

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

c'est bien ca, donc teste ta procédure en conditions réelles et normalement tes gains devraient bien être distribués correctement.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#153 29-01-2012 17:50:48

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Mais n'oublie pas avant de faire ce que je t'ai dit : de mettre ta requete de mise à jour des distances parcourues avant ta procédure, sinon ton classement sera faux, et tes gains seront distribués aux mauvais joueurs.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#154 29-01-2012 18:02:17

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bon, c'est en cour de test, départ de la course a 18h10
Mais dans la table m_course2, il peut y avoir plusieurs courses (des courses qui ont lieux à la meme heures). Sinon oui on supprime la table a la fin du cron

Hors ligne

#155 29-01-2012 18:02:56

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

.. Il y a un truc qui me chiffone.

Cf la page 5. Normalement, quand tu clotures une course tu as bien 2 courses en cours, une qui n'est pas terminée et l'autre oui. Tu dois monter dans m_course2 celle qui est terminée grâce à


WHERE (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(depart_theorique) > 1200 AND statut=2
 

à cette clause sur la table course, qui te permet d'identifier la bonne course (celle qui est terminée pour pouvoir y appliquer les mises à jour de distance et tes gains). Donc normalement dans m_course2 tu ne dois bien avoir qu'une seule course...

Dernière modification par Jc (29-01-2012 18:05:14)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#156 29-01-2012 18:05:49

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

ET si j'ai 2 courses, de meme durée qui commence au meme moment?

Hors ligne

#157 29-01-2012 18:10:23

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bien vu. Mais avant d'intégrer les courses multiples, fait fonctionner ton système correctement avec une course par intervalle de temps. Il te servira de modèle de base pour la gestion des courses multiples.

EDIT: D'ailleurs à ce propos, je me dépecherais à ta place de mettre à jour mon modèle et mon code avant de passer à cette étape, car sinon après tu risques de ne plus pouvoir la débogger sans dafalgan 1g.

Dernière modification par Jc (29-01-2012 18:15:46)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#158 29-01-2012 18:11:58

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

OK, tu as pas tord, ne compliquons pas tout dès le début ^^
La course vient de démarrer (statut 2), résultat dans 20 minutes wink

Hors ligne

#159 29-01-2012 18:56:22

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bon, y a/avait plusieurs bug dans la procédure,
j'en ai résolu plusieurs, mais y en a encore hmm

Et il n'y avait aucun appel a la table course, donc impossible de savoir les ressources mis en jeu
Donc en mieux ca donne :


CREATE PROCEDURE set_course_gains()
BEGIN
  DECLARE pos INT DEFAULT 0;
  DECLARE basevalue INT DEFAULT 60;
  DECLARE nbpart INT;
  DECLARE idpet INT;
  DECLARE nom_ress VARCHAR;
  DECLARE idpseudo INT;
  DECLARE qte_ress INT;
  DECLARE type_ress INT;
  DECLARE gains INT;
  DECLARE cur1 CURSOR FOR SELECT m_course2.id_course,m_course2.id_pet,id_pseudo, m_course2.nbparticipants, ressource_quantite, ressource_type, nom
        FROM m_course2 LEFT JOIN course ON m_course2.id_course=course.id_course
        LEFT JOIN ressources ON ressources.id_ressource=course.ressource_type
        ORDER BY dist_parcourue DESC LIMIT 3;
 
  OPEN cur1;
  START TRANSACTION;  
  REPEAT
    FETCH cur1 INTO idpet,idpseudo,nbpart,qte_ress,type_ress,nom_ress;
    SET pos=pos+1;
    IF pos=2 THEN SET basevalue=20; END IF;
    IF pos=3 THEN SET basevalue=10; END IF;
    SET gains=(basevalue/qte_ress*nbpart)*100;
    UPDATE perso_ressource SET nom_ress=(nom_ress+gains) WHERE id_pseudo=idpseudo;          
  UNTIL pos=3 END REPEAT;
  COMMIT;
  CLOSE cur1;
END##
 

Mais il me dit qu'il y a un soucis avec FETCH : #1328 - Incorrect number of FETCH variables
je vois avec google ce qu'il en pense...

Dernière modification par ebouilleur (29-01-2012 19:54:40)

Hors ligne

#160 29-01-2012 19:12:12

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Oui c'est normal il faut qu'il y ait une variable par champ pour le fetch et dans le même ordre que les champs du select.
Les procédures c'est super sensible^^.

Dernière modification par Jc (29-01-2012 19:12:37)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#161 29-01-2012 19:57:14

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Oui je vois que c'est sensible... plus j'avance, mieux ca devrait etre, mais non, j'ai tjs de nouvelles erreurs lol


CREATE PROCEDURE set_course_gains()
BEGIN
  DECLARE pos INT DEFAULT 0;
  DECLARE basevalue INT DEFAULT 60;
  DECLARE nbpart INT;
  DECLARE idpet INT;
  DECLARE nom_ress VARCHAR(40);
  DECLARE idcourse INT;
  DECLARE idpseudo INT;
  DECLARE qte_ress INT;
  DECLARE type_ress INT;
  DECLARE gains INT;
  DECLARE cur1 CURSOR FOR SELECT m_course2.id_course, m_course2.id_pet, pet.id_pseudo, m_course2.nbparticipants, ressource_quantite, ressource_type, nom
        FROM m_course2
        LEFT JOIN pet ON m_course2.id_pet = pet.id_pet
        LEFT JOIN course ON m_course2.id_course = course.id_course
        LEFT JOIN ressources ON ressources.id_ressource = course.ressource_type
        ORDER BY dist_parcourue DESC
        LIMIT 3;
 
  OPEN cur1;
  START TRANSACTION;  
  REPEAT
    FETCH cur1 INTO idcourse,idpet,idpseudo,nbpart,qte_ress,type_ress,nom_ress;
    SET pos=pos+1;
    IF pos=2 THEN SET basevalue=20; END IF;
    IF pos=3 THEN SET basevalue=10; END IF;
    SET gains=(basevalue/qte_ress*nbpart)*100;
    UPDATE perso_ressource SET nom_ress=(nom_ress+gains) WHERE id_pseudo=idpseudo;          
  UNTIL pos=3 END REPEAT;
  COMMIT;
  CLOSE cur1;
END##

 

La je pense que je suis tout proche de la vérité... mais pour mysql, non : #1054 - Unknown column 'nom_ress' in 'field list'
Pourtant j'ai déclarée cette variable. fetch a bien 7 champ comme select
bref tout roule ^^

Dernière modification par ebouilleur (29-01-2012 20:08:43)

Hors ligne

#162 29-01-2012 20:11:07

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Trier le résultat d'une requete puis l'afficher comme voulu

tu n'aurais pas un autre champ qui se nomme nom dans une des tables sélectionnées ?

a++

Hors ligne

#163 29-01-2012 20:16:31

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Arf, non, mais j'ai trouvé
le pb doit etre la : UPDATE perso_ressource SET nom_ress=(nom_ress+gains) WHERE id_pseudo=idpseudo;     
et je suppose qu'il veut croire que nom_ress est le nom de mon champ au lieu de prendre en comte le contenu de la variable... tu ne crois pas?

Quoi que...
je viens de modifier la ligne indiqué ci-dessus par :     
IF type_ress=6 THEN
UPDATE perso_ressource SET angreal=(nom_ress+gains) WHERE id_pseudo=idpseudo;  END IF;     

Mais il m'affiche tjs la meme erreur mysql

OK bon si je met

    IF type_ress=6 THEN
    UPDATE perso_ressource SET angreal=(angreal+gains) WHERE id_pseudo=idpseudo;  END IF;  

ca passe bcp mieux

Dernière modification par ebouilleur (29-01-2012 20:21:54)

Hors ligne

#164 29-01-2012 20:20:18

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Trier le résultat d'une requete puis l'afficher comme voulu

set nom_du_champ = valeur wink
tu as trouvé wink

a++

Hors ligne

#165 29-01-2012 20:41:25

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bon, donc apres changement de ce qui ne sert a rien, ca donne :


CREATE PROCEDURE set_course_gains()
BEGIN
  DECLARE pos INT DEFAULT 0;
  DECLARE basevalue INT DEFAULT 60;
  DECLARE nbpart INT;
  DECLARE idpet INT;
  DECLARE idcourse INT;
  DECLARE idpseudo INT;
  DECLARE qte_ress INT;
  DECLARE type_ress INT;
  DECLARE gains INT;
  DECLARE cur1 CURSOR FOR SELECT m_course2.id_course, m_course2.id_pet, pet.id_pseudo, m_course2.nbparticipants, ressource_quantite, ressource_type
        FROM m_course2
        LEFT JOIN pet ON m_course2.id_pet = pet.id_pet
        LEFT JOIN course ON m_course2.id_course = course.id_course
        ORDER BY dist_parcourue DESC
        LIMIT 3;
 
  OPEN cur1;
  START TRANSACTION;  
  REPEAT
    FETCH cur1 INTO idcourse,idpet,idpseudo,nbpart,qte_ress,type_ress;
    SET pos=pos+1;
    IF pos=2 THEN SET basevalue=20; END IF;
    IF pos=3 THEN SET basevalue=10; END IF;
    SET gains=(basevalue/qte_ress*nbpart)*100;
    IF type_ress=1 THEN UPDATE perso_ressource SET bois=(bois+gains) WHERE id_pseudo=idpseudo;  END IF;  
    IF type_ress=2 THEN UPDATE perso_ressource SET herbe=(herbe+gains) WHERE id_pseudo=idpseudo;  END IF;
    IF type_ress=3 THEN UPDATE perso_ressource SET viande=(viande+gains) WHERE id_pseudo=idpseudo;  END IF;
    IF type_ress=4 THEN UPDATE perso_ressource SET plante=(plante+gains) WHERE id_pseudo=idpseudo;  END IF;
    IF type_ress=5 THEN UPDATE perso_ressource SET fer=(fer+gains) WHERE id_pseudo=idpseudo;  END IF;
    IF type_ress=6 THEN UPDATE perso_ressource SET angreal=(angreal+gains) WHERE id_pseudo=idpseudo;  END IF;        
  UNTIL pos=3 END REPEAT;
  COMMIT;
  CLOSE cur1;
END##


 

Hors ligne

#166 30-01-2012 03:27:49

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Jc a écrit :

et je ne suis pas certain que ta combine pour le type de ressource soit accepté dans ta procédure, même si normalement ca devrait

Cela rejoint ce que j'avais dit. Donc normalement elle devrait fonctionner maintenant non?


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#167 30-01-2012 08:05:50

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bonjour,

Une chose aussi, dans un contexte transactionnel, j'ai fait une erreur, faut mettre le start transaction avant d'ouvrir le curseur, et le commit après le close. En effet dans un contexte multicourses, il faut préserver le contexte de mise à jour dans la transaction.

Dernière modification par Jc (30-01-2012 08:06:54)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#168 30-01-2012 23:03:37

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bon je crois que tout est bon maintenant.
Mais ca bloque a cause d'un soucis, identifié, mais que je ne sais pas résoudre.
Dans mon cron, si ma tabme m_course2 est vide, la procédure est quand meme exécuté, mais comme il n'y a rien a faire, ca génère une erreur (#1329 - No data - zero rows fetched, selected, or processed)
Y a t il un truc a faire de spécial? ou je faut faire une vérification pour voir si il y a des enregistrement dans m_crouse2 ?

Voila la procédure terminée smile :


CREATE PROCEDURE set_course_gains()
BEGIN
  DECLARE pos INT DEFAULT 0;
  DECLARE basevalue INT DEFAULT 60;
  DECLARE nbpart INT;
  DECLARE idpet INT;
  DECLARE idcourse INT;
  DECLARE idpseudo INT;
  DECLARE qte_ress INT;
  DECLARE type_ress INT;
  DECLARE gains INT;
  DECLARE cur1 CURSOR FOR SELECT m_course2.id_course, m_course2.id_pet, pet.id_pseudo, m_course2.nbparticipants, ressource_quantite, ressource_type
        FROM m_course2
        LEFT JOIN pet ON m_course2.id_pet = pet.id_pet
        LEFT JOIN course ON m_course2.id_course = course.id_course
        ORDER BY dist_parcourue DESC
        LIMIT 3;

  START TRANSACTION;  
  OPEN cur1;
  REPEAT
    FETCH cur1 INTO idcourse,idpet,idpseudo,nbpart,qte_ress,type_ress;
    SET pos=pos+1;
    IF pos=2 THEN SET basevalue=20; END IF;
    IF pos=3 THEN SET basevalue=10; END IF;
    SET gains=(basevalue*qte_ress*nbpart)/100;
    IF type_ress=1 THEN UPDATE perso_ressource SET bois=(bois+gains) WHERE id_pseudo=idpseudo;  END IF;  
    IF type_ress=2 THEN UPDATE perso_ressource SET herbe=(herbe+gains) WHERE id_pseudo=idpseudo;  END IF;
    IF type_ress=3 THEN UPDATE perso_ressource SET viande=(viande+gains) WHERE id_pseudo=idpseudo;  END IF;
    IF type_ress=4 THEN UPDATE perso_ressource SET plante=(plante+gains) WHERE id_pseudo=idpseudo;  END IF;
    IF type_ress=5 THEN UPDATE perso_ressource SET fer=(fer+gains) WHERE id_pseudo=idpseudo;  END IF;
    IF type_ress=6 THEN UPDATE perso_ressource SET angreal=(angreal+gains) WHERE id_pseudo=idpseudo;  END IF;        
  UNTIL pos=3 END REPEAT;
  CLOSE cur1;
  COMMIT;
END##
 

Merci Jc wink

Dernière modification par ebouilleur (30-01-2012 23:04:54)

Hors ligne

#169 31-01-2012 05:02:00

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bonjour,

Si m_course2 est vide au début de ton cron qui traite cette partie, c'est qu'il n'y a aucune course à clôturer. Par conséquent si c'est le cas, tu peux arrêter le traitement et sortir du cron après la requête qui est censé remplir la table. En gros si 0 éléments ont été insérés dans m_course2, alors fin du traitement. Tu peux faire cela avec mysql_affected_rows() juste après ton insert.


if (!mysql_affected_rows()){
// ton code de fin de traitement comme un COMMIT ou des ressources que tu dois clôturer par ex.
// die(); ou throw new Exception...
}
 

Rien que par rapport à cette instruction (de manière à la rendre pertinente) il te faudrait passer tous tes traitements en transactionnel. Car si au même moment un insert concurentiel à lieu dans la base de donnée (insertion de données pour un pet, un combat, ou autre) cela peut te faire planter ton cron.

PS: N'oublie pas de mettre à jour ton modèle de données, car cela va te pénaliser à un moment ou un autre. Déjà cela t'oblige à faire 6 lignes de code dans ta procédure qu'il faudra mettre à jour si le nombre de ressources augmente ou change, au lieu d'une simple requête unique de mise à jour universelle.

++

Dernière modification par Jc (31-01-2012 08:11:40)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#170 02-02-2012 17:11:00

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

J'ai du mettre

plutôt que ce que tu as dis, ca semblait ne pas fonctionner

Sinon, j'ai essayer de trouver un méthode pour traité plusieurs courses quand c'était nécessaire, mais toutes mes idées ont besoin de plus de requête... donc je supposes que j'ai pas trouvé LA bonne idée ^^

L'idée le moins pourri que j'ai trouvé, mais pas réussi a mettre en place, serai de faire un LIMIT 3 tout en groupant par id_course...
et apres faire un FETCH par id_course... roll

Hors ligne

#171 03-02-2012 17:02:42

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Je pense que la meilleure façon pour le multicourses pour le traitement des gains, c'est de modifier la requête qui utilise m_course2 dans ta procédure, de façon à faire un GROUP BY id_course avec un ORDER BY dessus, ainsi tu ne modifies en rien ton code de traitement, sauf que tu auras désormais un changement de course qui se fait modulo 3 (trois lignes/course). Tu auras donc un double tri: sur l'id course puis sur la distance parcourue en DESC. Il est en effet important sur tes résultats pour ton traitement que les lignes des 3 premiers pets se suivent pour chaque course.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#172 04-02-2012 22:06:48

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bonsoir,

Au fait pour ton if (mysql_affected_rows()!=0){  tu fais le contraire de ce que j'exprimais, c'est à dire que si mysql_affected_rows==0 alors tu quittes le traitement. Alors qu'ici ce que tu fais c'est de tester si des insertions ont bien eu lieues (auquel cas il ne faut pas quitter mais faire les traitements).

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#173 05-02-2012 03:37:48

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bah ca marche pourtant comme ca... et faut bien faire qqchose si il y a eu des insertions, donc si différent...

Edit : non ca ne fonctionne pas... tu avais raison, je me suis trompé, sorry

Dernière modification par ebouilleur (06-02-2012 20:12:20)

Hors ligne

#174 13-02-2012 19:13:12

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Jc a écrit :

Bonsoir,

Au fait pour ton if (mysql_affected_rows()!=0){  tu fais le contraire de ce que j'exprimais, c'est à dire que si mysql_affected_rows==0 alors tu quittes le traitement. Alors qu'ici ce que tu fais c'est de tester si des insertions ont bien eu lieues (auquel cas il ne faut pas quitter mais faire les traitements).

++

En fait j'ai fait un  if (mysql_affected_rows()>0){ et la ca fonctionne correctement.

Je pense que la meilleure façon pour le multicourses pour le traitement des gains, c'est de modifier la requête qui utilise m_course2 dans ta procédure, de façon à faire un GROUP BY id_course avec un ORDER BY dessus, ainsi tu ne modifies en rien ton code de traitement, sauf que tu auras désormais un changement de course qui se fait modulo 3 (trois lignes/course). Tu auras donc un double tri: sur l'id course puis sur la distance parcourue en DESC. Il est en effet important sur tes résultats pour ton traitement que les lignes des 3 premiers pets se suivent pour chaque course.

J'arrive pas à faire ce que je veux :(
Je vois pas comment faire un LIMIT 3 mais qui ne soit valable que sur un type de champ d'une colonne :( (avec le GROUP BY en fait)...


Sinon, j'ai besoin d'un autre coup de main pour modifier la fonction mysql que tu m'avais proposé pour le calcule de distance.
Pour mémoire la voici :

CREATE DEFINER=`root`@`localhost` FUNCTION `calc_dist`(endurance smallint, temps smallint, puissance_min smallint, puissance smallint, duree smallint) RETURNS decimal(6,2)
RETURN ((puissance-(puissance_min/endurance)*temps/(duree*120))*temps)

Et j'aimerais la modifier pour qu'elle donne ceci
:(équivalent en php) :

function calcul_distance_course3($strong,$agilite,$intel,$endurance,$temps,$puissance_min,$duree,$type_circuit)
// on calcule la distance parcouru par le pet

{
  $rand = mt_rand(-999,999);
  $rand = $rand/100;
  if ($type_circuit == S) $add_competence = $strong;
  if ($type_circuit == A) $add_competence = $agilite;
  if ($type_circuit == I) $add_competence = $intel;
  if ($type_circuit == E) $add_competence = $endurance;
  $puissance = $strong + $agilite + $intel;
  $distance_parcouru = ( $puissance - (($puissance_min+$add_competence)/$endurance) * ($temps)/($duree * 20 * 60) ) * $temps + $rand ;
  return $distance_parcouru;
}

Mais je ne sais trop comment m'y prendre.
Merci

Hors ligne

#175 01-03-2012 23:12:14

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bonjour,

Désolé pour le temps mis à te répondre, mais je n'ai pas beaucoup de temps de libre ces derniers temps et cela risque d'être encore difficile pour moi une bonne partie du mois.

1) Pour ton mysql_affected_rows >0 cela marche en effet pareil, pas de soucis smile
2) Pour arriver à tes fins avec l'ordre des courses, tu ne peux l'avoir en relationnel qu'en effectuant un tri sur plusieurs critères consécutifs en même temps et un regroupement par course_id. Le regroupement va te permettre d'avoir tous les enregistrements d'une même course consécutifs ce qui est essentiel. Il te faut dessus faire un order by dist_parcourue DESC pour avoir un arrangement des lignes par ordre d'arrivée avec un limit 3 pour n'avoir que les 3 premiers. (c'est ce que tu as déjà de mémoire). A partir de la, la 4e ligne correspondra au premier de la course suivante, la 7e ligne au premier de la 3e course etc...

La seule chose à laquelle il te faut rester vigilant c'est que tes ORDER BY ne viennent pas modifier la consécutivité des enregistrements d'une même course. Il te faut donc protéger cela via la structure même de ta requête.

3) Tu as déjà les infos pour résoudre ton problème.
Voici un exemple de fonction issu du manuel de mysql


CREATE FUNCTION f3(p_id INT)
RETURNS INT
BEGIN
UPDATE t SET modtime = NOW() WHERE id = p_id;
RETURN ROW_COUNT();
END;
 

ayant déjà développé une procédure dans ce post, avec cette info là, tu as tout ce qu'il te faut pour mettre à jour ta fonction, l'algo étant déjà fait également.

++

Dernière modification par Jc (01-03-2012 23:14:23)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums