PHP|Débutant :: Forums

Advertisement

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

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

#26 17-11-2011 16:24:38

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

Donc en gros tu ne stock jamais de valeur time() en bdd?
Car mon cron, pour savoir si une course est a lancé, je fais ca :


$heure_depart  =  time() ;   
$select = "SELECT id_course, depart, nom_circuit, level_min, level_max, ressource_type, ressource_quantite FROM course WHERE depart<='".$heure_depart."' AND status='0' ";
 

Pour le moment je gere "duree" en minutes, mais si tu as besoin de l'avoir en second, je peux modifier

Voila mes tables (j'ai mis la table course_participant, mais je pense vu ce que tu m'a dis que je vais devoir le modifier bcp):

CREATE TABLE IF NOT EXISTS `course` (
  `id_course` int(11) NOT NULL auto_increment,
  `id_pseudo` int(11) NOT NULL,
  `time_depart` int(11) NOT NULL,
  `datetime_depart` datetime NOT NULL,
  `duree` tinyint(3) unsigned NOT NULL,
  `status` tinyint(3) unsigned NOT NULL,
  `nom_circuit` varchar(20) NOT NULL,
  `level_min` tinyint(3) unsigned NOT NULL,
  `level_max` tinyint(3) unsigned NOT NULL,
  `ressource_type` tinyint(1) NOT NULL,
  `ressource_quantite` int(11) NOT NULL,
  `puissance_min` smallint(5) unsigned NOT NULL,
  `time_maj_distance` varchar(30) NOT NULL,
  UNIQUE KEY `id` (`id_course`),
  KEY `id_pseudo` (`id_pseudo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

CREATE TABLE IF NOT EXISTS `course_participant` (
  `id_course` int(11) NOT NULL,
  `id_pet` int(11) NOT NULL,
  `id_pseudo` int(11) NOT NULL,
  `pseudo` varchar(40) NOT NULL,
  `strengh` tinyint(3) unsigned NOT NULL,
  `agilite` tinyint(3) unsigned NOT NULL,
  `intel` tinyint(3) unsigned NOT NULL,
  `endurance` tinyint(3) unsigned NOT NULL,
  `puissance` tinyint(3) unsigned NOT NULL,
  `distance` int(10) unsigned NOT NULL,
  KEY `id_pet` (`id_pet`),
  KEY `id_pseudo` (`id_pseudo`),
  KEY `distance` (`distance`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


 

Dernière modification par ebouilleur (17-11-2011 16:26:02)

Hors ligne

#27 17-11-2011 17:05:59

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

Aïe^^ wink

Bon je vais essayer de t'expliquer, car en plus ta tâche CRON est fausse.
1) Pour la durée c'est toi qui décide si tu désires l'exprimer en minutes ou en secondes. Ce que je disais c'est de faire attention à ta définition selon ton choix pour que tu comprennes.
2) Pour ton départ tu n'as besoin que d'un seul champ:  depart DATETIME NULL DEFAULT NULL
3) Tu peux stocker une valeur de type TIME dans MySQL mais dans un champ TIME et toujours pas dans un VARCHAR ou un INT. Pourquoi? et Pourquoi il faut que tu le fasses dans un DATETIME dans ton cas?
a) Si tu le fait dans un champ TIME, tu auras un problème dans ta tâche CRON car tu lanceras toutes les courses pour une heure donnée sans te soucier du jour et c'est source d'erreur. Comment fais-tu ensuite pour différencier la course de 14h du lundi de celle du mardi à la même heure (même circuit, etc...)?
b) Dans ta tâche CRON que tu m'as montré, tu as deux erreurs. La première est que $heure_depart est bien une heure (au format PHP) et donc définie au format séxagésimal, et que dans ta table si départ est défini en INT (format décimal) ta comparaison sera au petit bonheur la chance sans parler du fait que le format de date et d'heure dans mysql est ou peut être différent de celui défini dans PHP...
c) La deuxième erreur de ta tache CRON, est sa grande instabilité et sa grande imprécision. Il serait plus judicieux de créer un status=1 par exemple pour dire quelles sont les courses prêtes à partir (nombre de participants requis, etc...) et de faire un UPDATE course SET depart=NOW() where status=1 par exemple où l'heure de départ tiendrait compte du jour et de l'heure et correspond à l'heure à la seconde prêt du départ réel de la course, et non une heure approximative comme actuellement car depart correspond à l'heure prévue du départ de la course et non l'heure à laquelle elle a été lancée.


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

Hors ligne

#28 17-11-2011 17:13: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

Note: Tu pourrais également alléger ton serveur et créer des horaires de course (par exemple toutes les 15min) ce qui libérerait la charge de ton CRON pour d'autres tâches, comme la vérification des courses prêtes à partir, etc...


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

Hors ligne

#29 17-11-2011 17:20:27

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 :

b) Dans ta tâche CRON que tu m'as montré, tu as deux erreurs. La première est que $heure_depart est bien une heure (au format PHP) et donc définie au format séxagésimal, et que dans ta table si départ est défini en INT (format décimal) ta comparaison sera au petit bonheur la chance sans parler du fait que le format de date et d'heure dans mysql est ou peut être différent de celui défini dans PHP...

$heure_depart contient la valeur de time() au moment ou sera lancé mon cron. et dans ma bdd, le champ "depart" contient la valeur time() dans quand sera lancé la course donc en gros ca donne un truc genre (avec depart = 1321545090 par exemple) :


SELECT id_course, depart, nom_circuit, level_min, level_max, ressource_type, ressource_quantite FROM course WHERE depart<='1321546004' AND status='0'
 

Donc je ne vois pas ou c'est instable hmm

Jc a écrit :

c) La deuxième erreur de ta tache CRON, est sa grande instabilité et sa grande imprécision. Il serait plus judicieux de créer un status=1 par exemple pour dire quelles sont les courses prêtes à partir (nombre de participants requis, etc...) et de faire un UPDATE course SET depart=NOW() where status=1 par exemple où l'heure de départ tiendrait compte du jour et de l'heure et correspond à l'heure à la seconde prêt du départ réel de la course, et non une heure approximative comme actuellement car depart correspond à l'heure prévue du départ de la course et non l'heure à laquelle elle a été lancée.

Admettons que le status 1 soit le "pret a partir", tu fais comment pour passer du status 0 à 1 ?
Car quand le joueur crée une course, il sélection le circuit, et l'heure/jour de départ (choix d'une liste déroulante, pour faire simple les départs sont possible a xh10 ou xh30 ou xh50).
Donc ce n'est pas moi, ni le joueur qui donnons le "top départ"...

Par rapport a ta note, je crois y comprendre que le cron qui lancerai le départ ne ferai pas de vérification alors?

Dernière modification par ebouilleur (17-11-2011 17:58:52)

Hors ligne

#30 17-11-2011 17:47:08

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

Le but n'est pas de stocker une valeur time (définie en php) dans un champ varchar, mais l'intérêt est de le faire gérer par mysql et pour cela il faut définir un champ approprié pour que mysql puisse le faire correctement.

EDIT:

depart<='1321546004'

Ici MYSQL ne compare pas des heures mais deux chaînes de caractères contenant que des chiffres.. Je te laisse regarder dans la doc comment cela peut être interprété par MySQL....

Si dans ton appli tu as 3 départ possibles par heure (3 tâches cron / heure) alors c'est certain que l'on peut faire différemment aussi. Donc j'expose les deux méthodes (la tienne et la mienne)
- Ton cas de figure
le champ départ correspond à la date et l'heure (défini en datetime) du choix de l'utilisateur pour le départ de sa course. La tâche cron lance automatiquement les courses définies avec un départ qui corresponds à l'heure pour laquelle la tâche s'est éxécutée (pas besoin de faire comme tu fais en passant par php).
Problème: s'il n'y a qu'un inscrit, la course par quand même....

-Le mien
Vu la précision que tu m'as apporté quand aux horaires de départ existants, tu peux garder le champ départ avec l'heure prévue (en datetime) mais tu auras un petit décalage en l'heure prévue et l'heure réelle du départ (inférieur à 1 ou plusieurs secondes). Pour lever cette imprécision, dans le cas où par exemple il est possible qu'un pet puisse gagner une course à une seconde prêt, il te faudra un champ supplémentaire pour l'heure de départ effectif toujours en datetime.
Pour l'histoire du status=1, suffit de faire un cron 10 min avant chaque départ prévu de course, pour vérifier que les demandes de courses pour le prochain départ soient ok. Si ok alors update avec statut=1, sinon notification au joueur, que sa course pour le prochain départ ne pourra pas avoir lieu faute de participants par ex.

Dernière modification par Jc (17-11-2011 18:20:20)


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

Hors ligne

#31 17-11-2011 18:27:05

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 :

le champ départ correspond à la date et l'heure (défini en datetime) du choix de l'utilisateur pour le départ de sa course. La tâche cron lance automatiquement les courses définies avec un départ qui corresponds à l'heure pour laquelle la tâche s'est éxécutée (pas besoin de faire comme tu fais en passant par php).
Problème: s'il n'y a qu'un inscrit, la course par quand même....

Dans mon cron il y avait différente verif avant de passer au calcul. La course n'a pas lieu si il y a moins de 4 participants

Mais ok, on va partir sur ta proposition :

Du coup il y a 4 status :
0 : course ouverte au inscription
1 : cloture des inscriptions 10 min avant le départ -> cron qui vérifie le nb de joueur
2 : course en cours
3 : course terminée

CREATE TABLE IF NOT EXISTS `course` (
  `id_course` int(11) NOT NULL auto_increment,
  `id_pseudo` int(11) NOT NULL,
  `depart_theorique` datetime NOT NULL,
  `depart` datetime NOT NULL,
  `duree` tinyint(3) unsigned NOT NULL,
  `status` tinyint(3) unsigned NOT NULL,
  `nom_circuit` varchar(20) NOT NULL,
  `level_min` tinyint(3) unsigned NOT NULL,
  `level_max` tinyint(3) unsigned NOT NULL,
  `ressource_type` tinyint(1) NOT NULL,
  `ressource_quantite` int(11) NOT NULL,
  `puissance_min` smallint(5) unsigned NOT NULL,
  UNIQUE KEY `id` (`id_course`),
  KEY `id_pseudo` (`id_pseudo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

 

Ca donne ca, avec depart_theorique qui est le champ rempli a la création de la course et depart qui est celui qui est pour toi (NULL avant le lancement de la course)

Ca te convient? smile

Dernière modification par ebouilleur (17-11-2011 18:29:27)

Hors ligne

#32 17-11-2011 18:40:51

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 sauf que tu as défini depart en NOT NULL donc il ne peut prendre la valeur NULL^^. La définition exacte je te l'ai donnée precedemment : depart DATETIME NULL DEFAULT NULL
et que pour le 1 tu as donné une définition et non pas un statut. Cela serait 1: Prêt au départ^^

Allez, j'essaye de te faire ca au plus tôt. wink


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

Hors ligne

#33 17-11-2011 18:42:46

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

Compte tenu de tes mises à jour, voici celles que tu dois faire pour ta procédure


DELIMITER $$
CREATE DEFINER `root`@`localhost`
FUNCTION `calc_dist`(strengh tinyint, agilite tinyint, intel tinyint, endu tinyint, temps tinyint, power_min tinyint, duree tinyint) RETURNS DECIMAL (6,2)
RETURN ((((strengh+agilite+intel)-(power_min/endu)*temps)/(duree*120))*temps)
 

Comme tu le verras, les paramètres de cette procédure correspondront dans ma requête aux champs respectifs dans la table pets et non course_participants. Donc pense à mettre à jour les définitions dans ta table.

Dernière modification par Jc (17-11-2011 18:44:57)


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

Hors ligne

#34 17-11-2011 18:44:57

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 :

Oui sauf que tu as défini depart en NOT NULL donc il ne peut prendre la valeur NULL^^. La définition exacte je te l'ai donnée precedemment : depart DATETIME NULL DEFAULT NULL

^^ je voulais voir si tu suivais wink
merci


Pour la procédure, je pense que j'y verrais mieux avec ta requête, mais juste pour rappel, "temps" est le temps écoulé depuis le début de la course et power_min l'addition de force+agilité+intel

Dernière modification par ebouilleur (17-11-2011 18:50:59)

Hors ligne

#35 17-11-2011 18:49:03

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 :

Compte tenu de tes mises à jour, voici celles que tu dois faire pour ta procédure


DELIMITER $$
CREATE DEFINER `root`@`localhost`
FUNCTION `calc_dist`(strengh tinyint, agilite tinyint, intel tinyint, endu tinyint, temps tinyint, power_min tinyint, duree tinyint) RETURNS DECIMAL (6,2)
RETURN ((((strengh+agilite+intel)-(power_min/endu)*temps)/(duree*120))*temps)
 

Comme tu le verras, les paramètres de cette procédure correspondront dans ma requête aux champs respectifs dans la table pets et non course_participants. Donc pense à mettre à jour les définitions dans ta table.

OK alors, peux tu prendre en compte que pour ne pas a avoir a modifier toutes mes autres page du site, met :


DELIMITER $$
CREATE DEFINER `root`@`localhost`
FUNCTION `calc_dist`(strengh tinyint, agilite tinyint, intelligence tinyint, endurance tinyint, temps tinyint, power_min tinyint, duree tinyint) RETURNS DECIMAL (6,2)
RETURN ((((strengh+agilite+intelligence)-(power_min/endurance)*temps)/(duree*120))*temps)
 

Merci

Dernière modification par ebouilleur (17-11-2011 18:49:44)

Hors ligne

#36 20-11-2011 02:32:28

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,

Donc voila, il est tard donc je passe sur les explications pour le moment mais on en parle quand tu veux wink

A) Les modifs à faire pour que cela fonctionne bien

1) Table course_participant
- Supprimer tous les indexs.
- Créer Primary Key (id_course, id_pet)
- Si tu passes sur innodb rajouter : key id_pet

2) Table Course
- Supprimer key id_pseudo
- Créer primary key id_course
- Créer key status

3) Table pet
- Supprimer unique key id_pet
- Créer primary key id_pet
- key id_pseudo

B) Requête de gestion de course


SELECT t1.id_course, t1.id_pet, (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(t1.depart))/60 AS ellapsed, calc_dist(t2.strong,t2.agilite,t2.intelligence,t2.endurance,ellapsed,t1.puissance_min,t1.duree) AS dist_parcourue, t1.duree-ellapsed AS tps_restant
FROM course_participant as t1 LEFT JOIN pet as t2 ON t1.id_pet=t2.id_pet
WHERE t1.status=2
ORDER BY dist_parcourue DESC
 

Alors tu vois, la requête est super simple. Si dans la table course il y avait la distance de la course, on peut rajouter un champ dans la requête pour dire si un pet à gagné (déjà parcourue la distance) au moment de la consultation et avant le temps imparti (20min) pour la parcourir.
De plus la coloration syntaxique a souligné t1.status à juste titre, remplace le par statut cela évitera bien des problèmes.

++

Dernière modification par Jc (20-11-2011 02:38:00)


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

Hors ligne

#37 20-11-2011 10:53:25

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,

J'avais pas fait attention que

ebouileur a écrit :

...power_min est l'addition de force+agilité+intel

Ce qui s'implifie pas mal les choses puisque


DELIMITER $$
CREATE DEFINER `root`@`localhost`
FUNCTION `calc_dist`(endurance tinyint, temps tinyint, power_min tinyint, duree tinyint) RETURNS DECIMAL (6,2)
RETURN (((power_min-(power_min/endurance)*temps)/(duree*120))*temps)
 

est donc equivalent
d'où la nouvelle requête


SELECT t1.id_course, t1.id_pet, (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(t1.depart))/60 AS ellapsed,
calc_dist(t2.endurance,ellapsed,t2.puissance_min,t1.duree) AS dist_parcourue, t1.duree-ellapsed AS tps_restant
FROM course_participant AS t1 LEFT JOIN pet AS t2 ON t1.id_pet=t2.id_pet
WHERE t1.status=2
ORDER BY dist_parcourue DESC
 

Mais il faut rajouter puissance_min dans la table pet (dans la table course cela n'est pas sa place) pour l'avoir pour chaque pet. C'est pour cela que puissance_min ici est appelé à partir de t2.
Voilà. Si il y a un souci avec la requête dis-le, j'ai pas test.

Dernière modification par Jc (21-11-2011 14:41:47)


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

Hors ligne

#38 21-11-2011 00:00:50

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

Salut,
Merci pour ton retour,

Jc a écrit :

1) Table course_participant
- Supprimer tous les indexs.
- Créer Primary Key (id_course, id_pet)
- Si tu passes sur innodb rajouter : key id_pet

Je ne peux pas mettre Primary key sur id_course, car j'ai plusieurs enregistrement avec le meme id_course.
Et sinon, dans cette table, je garde juste les champs : id_course , id_pet, id_pseudo ?
Dans ta requete, je crois comprendre que je dois rajouter le champ "depart" ?

Sinon j'ai une erreur pour créer ta procédure :


Erreur

requête SQL:

CREATE DEFINER `root`@`localhost` FUNCTION `calc_dist` (
endurance tinyint,
temps tinyint,
power_min tinyint,
duree tinyint
) RETURNS DECIMAL( 6, 2 ) RETURN (
(
(
power_min - ( power_min / endurance ) * temps
) / ( duree *120 )
) * temps
)


MySQL a répondu:
 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`root`@`localhost`
 FUNCTION `calc_dist`(endurance tinyint, temps tinyint, power' at line 1

Et la formule de calcule de distance, c'est une formule simple pour le moment, sans variable aléatoire.. si je dois en rajouter une, pour rendre la course plus réaliste, on peut?

Merci

Dernière modification par ebouilleur (21-11-2011 00:18:16)

Hors ligne

#39 21-11-2011 11:02:20

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,

Concernant la primary key tu peux car je t'ai demandé d'en mettre une sur id_course ET sur id_pet. Cela s'appele crée une clé primaire composite. Ta table deviendra une table de jonction.
Retire le create definer au pire commence directement à partir de function. Et ce n'est pas une requête SQL mais une fonction DDL^^. power est un mot clé de part ailleurs donc gaffe qu'il soit bien suivi de _min tout attaché. Il faut de plus utilsé la fonction avec les définitions en SMALLINT ^^.

Pour répondre à ta question. Oui tu pourras.

Dernière modification par Jc (21-11-2011 11:06:22)


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

Hors ligne

#40 21-11-2011 14:16:40

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, pour les 2 clés primaires c'est ok.

Pour la procédure, j'ai pu la faire en faisant juste :


CREATE FUNCTION `calc_dist`(endurance smallint, temps smallint, power_min smallint, duree smallint) RETURNS DECIMAL (6,2)
RETURN (((power_min-(power_min/endurance)*temps)/(duree*120))*temps)
 

et en indiquant $$ dans la case délimiteur
smile

Tu ne m'a pas répondu pour ma question sur la table course_participant :
Et sinon, dans cette table, je garde juste les champs : id_course , id_pet, id_pseudo ?
Dans ta requete, je crois comprendre que je dois rajouter le champ "depart" ?

Dernière modification par ebouilleur (21-11-2011 14:18:08)

Hors ligne

#41 21-11-2011 14:41:29

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

Désolé pour la requête me suis trompé...


SELECT t1.id_course, t1.id_pet, (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(t3.depart))/60 AS ellapsed,
calc_dist(t2.endurance,ellapsed,t2.puissance_min,t3.duree) AS dist_parcourue, t3.duree-ellapsed AS tps_restant
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_couse=t3.id_course
WHERE t3.status=2
ORDER BY dist_parcourue DESC
 

Comme quoi faire des requêtes à 2h du mat, il n'y a pas que du bon..

Dernière modification par Jc (21-11-2011 14:44:44)


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

Hors ligne

#42 21-11-2011 15:45:30

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, il manquait des parenthèses, et un r a course et statut avec un T (ou non un s vu que tu m'a conseiller de changer).
Mais j'ai quand meme une erreur mysql que je trouve pas hmm


SELECT t1.id_course, t1.id_pet, (
(
(
UNIX_TIMESTAMP( NOW( ) ) - UNIX_TIMESTAMP( t3.depart )
) /60
) AS ellapsed, calc_dist(
t2.endurance, ellapsed, t2.puissance_min, t3.duree
) AS dist_parcourue, (
t3.duree - ellapsed
) AS tps_restant
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
WHERE t3.statut =2
ORDER BY dist_parcourue DESC
LIMIT 0 , 30

MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS ellapsed,
    calc_dist(t2.endurance,ellapsed,t2.puissance_min,t3.duree) AS d' at line 1

Hors ligne

#43 21-11-2011 15:51:06

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

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

SELECT t1.id_course,
       t1.id_pet,
       ((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(t3.depart)) /60) AS ellapsed,
       calc_dist(t2.endurance, ellapsed, t2.puissance_min, t3.duree) AS dist_parcourue,
       (t3.duree - ellapsed) AS tps_restant
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
WHERE t3.statut =2
ORDER BY dist_parcourue DESC
LIMIT 0 , 30

Mais je doute que tu aies le droit d'utiliser l'alias ellapsed dans les calculs inter-colonnes du SELECT.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#44 21-11-2011 18:01:24

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, c'est mieux, mais tu dois avoir raison, là j'ai comme erreur : #1054 - Unknown column 'ellapsed' in 'field list'

Humm même en modifiant ellapsed par autre chose ca ne fonctionne pas (même erreur)...


Remarque autre : J'étais en train de coder mon cron pour passer une course au statut 1 -> 2
et je viens de penser que je t'ai pas expliquer un truc (qui ne change pas grand chose).
dans la table course, il y a puissance_min. C'est le plus faible puissance_min de tous les participant et c'est celui la qu'il faut utiliser dans la procédure stockée
Edit 2 : Arf, je m'embrouille moi meme avec tout ca ^^
J'explique : le puissance_min est le meme pour tout le monde (le plus pet de tous les pet) par contre on a bien besoin de strenght, agilite et intel (=power ci-dessous et contenu dans la table pet) de chaque pet ^^

Donc pour la procédure ca doit donner :


CREATE FUNCTION `calc_dist`(endurance smallint, temps smallint, power_min smallint, power smallint, duree smallint) RETURNS DECIMAL (6,2)
RETURN (((power-(power_min/endurance)*temps)/(duree*120))*temps)
 

Dernière modification par ebouilleur (21-11-2011 18:27:54)

Hors ligne

#45 21-11-2011 18:48: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

Pour ellapsed, s'il ne le trouve pas, c'est pas grave et c'est normal, à chaque fois j'oublie ce souci. Donc remplace partout où tu l'utilises son nom par sa définition (la soustraction).
Ne définie pas "power" comme nom de champ dans ta procédure c'est un nom réservé. Utilise power_norm ou tout ce que tu veux d'autre mais pas power (regarde la coloration syntaxique).

Donc le power = la puissance de chaque pet
et power_min = la puissance la plus faible de tous les participants c'est cela?

Si c'est ça faut modifier la requête...
je vais en profiter aussi pour la modifier pour que tu n'aies pas "Donc remplace partout où tu l'utilises son nom par sa définition (la soustraction)." à faire..

Je reviens vers toi. Mais modifie ce dont je viens de parler stp.

Dernière modification par Jc (21-11-2011 18:51:09)


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

Hors ligne

#46 21-11-2011 18:51:34

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 :

Donc le power = la puissance de chaque pet
et power_min = la puissance la plus faible de tous les participants c'est cela?.

Oui c'est ca. ésolé de pas y avoir pensé avant

Hors ligne

#47 21-11-2011 19:21:27

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

Procédure modifiée comme suit :


CREATE 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)
 
Jc a écrit :

Pour ellapsed, s'il ne le trouve pas, c'est pas grave et c'est normal, à chaque fois j'oublie ce souci. Donc remplace partout où tu l'utilises son nom par sa définition (la soustraction).

Et pour ca.. je ne vois pas quoi faire hmm

Dernière modification par ebouilleur (21-11-2011 19:28:32)

Hors ligne

#48 21-11-2011 19:29:41

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

Voici la nouvelle requête (pas test car pas le temps de me monter une simulation)


SELECT t1.id_course,t1.id_pet,t5.ellapsed,calc_dist(t2.endurance,t5.ellapsed,t4.power_min,t3.duree) as dist_parcourue,
t3.duree-t5.ellapsed AS tps_restant
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 power_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  
LEFT JOIN
  (SELECT id_course, ((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(depart)) /60) AS ellapsed FROM course) as t5 ON t1.id_course=t5.id_course
WHERE t3.status=2
ORDER BY dist_parcourue DESC
 

Si tu as un souci avec la clause ORDER BY remplace dist_parcourue par la formule calc_dist


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

Hors ligne

#49 21-11-2011 19:36:57

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 après qq ajustement c'est ok avec :


SELECT t1.id_course,t1.id_pet,t5.ellapsed,calc_dist(t2.endurance,t5.ellapsed,t4.puissance_min,t2.puissance,t3.duree) as dist_parcourue,
t3.duree-t5.ellapsed AS tps_restant
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  
LEFT JOIN
  (SELECT id_course, ((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(depart)) /60) AS ellapsed FROM course) as t5 ON t1.id_course=t5.id_course
WHERE t3.statut=2
ORDER BY dist_parcourue DESC
 

Après un test rapide, (avec un départ à 19h30) le résultat de la requete me donne :

id_course     id_pet     ellapsed     dist_parcourue      tps_restant
2    23    14.7000    0.01    5.3000
2    1    14.7000    -0.04    5.3000
2    32    14.7000    -0.44    5.3000

id_course     id_pet     ellapsed     dist_parcourue      tps_restant
2    23    16.2167    0.00    3.7833
2    1    16.2167    -0.06    3.7833
2    32    16.2167    -0.50    3.7833

Donc y a un truc qui cloche sad

Dernière modification par ebouilleur (21-11-2011 19:46:41)

Hors ligne

#50 21-11-2011 20:03:01

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

- Les temps sont en minutes duree et ellapsed.
- Les types de champs dans ta table utilisés dans la fonction doivent correspondre à ceux de la fonction (or duree en tinyint d'un coté et smallint de l'autre).
- Je n'ai pas vérifé la pertinence du calcul de ta fonction de distance..
- Pour vérifier les données entrées dans la fonction tu peux rajouter le champs t4.puissance_min dans la requête principale.
- Je ne sais pas ce que tu appeles "qq ajustements" ...

Ce qui me semble clocher c'est ton calcul de distance. Vérifie tout de même la valeur de t4.puissance_min.

Dernière modification par Jc (21-11-2011 20:03:59)


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

Hors ligne

Pied de page des forums