PHP|Débutant :: Forums

Advertisement

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

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

#26 Re : MySQL, PostgreSQL, etc... » Comparaison de 2 requetes » 19-09-2012 11:40:38

En fait, je m'auto répond
Le "updatetime BETWEEN '2012-08-20 00:00:00' AND '2012-08-25 00:00:00'" de la 1ere requete n'est pas du tout pris en compte ^^

#27 MySQL, PostgreSQL, etc... » Comparaison de 2 requetes » 19-09-2012 11:40:38

ebouilleur
Réponses : 3

Bonjour,

Par erreur j'ai écris la requete suivante :


SELECT DISTINCT nombre FROM incident_hebdo
WHERE problemstatus IN ('Fermé')
AND Priority  = 3
AND AppelType = 'Demande'
AND ProblemAssignement IN (SELECT Equipe FROM EquipeLocaleInformatique)
GROUP BY Nombre, ProblemAssignement
AND
updatetime BETWEEN '2012-08-20 00:00:00' AND '2012-08-25 00:00:00'
 

Qui me sortie 124 enregistrements.
Puis j'ai vu que mon GROUP BY n'était pas à la fin, j'ai donc corrigé en :


SELECT DISTINCT nombre FROM incident_hebdo
WHERE problemstatus IN ('Fermé')
AND Priority  = 3
AND AppelType = 'Demande'
AND ProblemAssignement IN (SELECT Equipe FROM EquipeLocaleInformatique)
AND updatetime BETWEEN '2012-08-20 00:00:00' AND '2012-08-25 00:00:00'
GROUP BY Nombre, ProblemAssignement
 

Et la surprise, j'ai plus que 94 enregistrements.
Donc, j'en conclu que ce n'est pas la meme requete ^^
Le GROUP BY est pas sensé etre tjs a la fin?
Et du coup quelle est la différence entre mes 2 requetes?

Merci

#28 Re : Forum Général PHP » [Procédure stocké ] Calcul d'heure sur une base de 11h (et non 24h) » 22-08-2012 00:32:07

Salut,

Tu dis :
pour avoir le nombre d'heures totales entre deux dates, il suffit de faire un
(UNIX_TIMESTAMP(end_date)-UNIX_TIMESTAMP(start_date))/3600

Oui ca donne le nombre d'heure entre 2 dates, mais la en dehors des ouverts ouvrés "le temps s'arrête"
Par exemple, pour les heures ouvré de 8h a 19h, si j'ai un dossier qui a été ouvert à 18h et fermé le lendemain a 9h, ce dossier aura été ouvert pendant 2h.

Enfin je note que je dois faire une table hollidays pour stocker les jours fériés

merci smile

#29 Re : Forum Général PHP » [Procédure stocké ] Calcul d'heure sur une base de 11h (et non 24h) » 22-08-2012 00:32:07

bonjour,

A defaut de réussir a adapter quelque chose que je ne maitrissais pas, j'ai pondu la fonction suivante en php. IL ne me reste plus qu'a en faire une procédure stockée.


    <?php
    // Fonction permettant de compter le nombre de jours ouvrés entre deux dates
    function get_nb_open_hours($date_start_full, $date_stop_full) {
    // on décompose la date en jour / heure
    $pieces1 = explode(" ", $date_start_full);
    $date_start = $pieces1[0];
    $heure_start = $pieces1[0];    
    $pieces2 = explode(" ", $date_stop_full);
    $date_stop = $pieces2[0];
    $heure_stop = $pieces2[0];
    // variable  (format date dans la bdd : 2012-04-30 11:19:42)
    $heure_open = '08:00:00';
    $heure_close = "19:00:00";
    $date_close_start = $date_start." ".$heure_close;
    $date_open_start = $date_stop." ".$heure_open;    
    $opentime = 11;
   
    $date_start = strtotime($date_start);
    $date_stop = strtotime($date_stop);

    if ($date_start != $date_stop){
    $nb_second_first_et_last_jour = (strtotime($date_close_start) - strtotime($date_start_full)) + (strtotime($date_stop_full) - strtotime($date_open_start));
    }else{
    $nb_second_first_et_last_jour = (strtotime($date_stop_full) - strtotime($date_start_full));
    }

    $arr_bank_holidays = array(); // Tableau des jours feriés
    // On boucle dans le cas où l'année de départ serait différente de l'année d'arrivée
    $diff_year = date('Y', $date_stop) - date('Y', $date_start);
    for ($i = 0; $i <= $diff_year; $i++) {
    $year = (int)date('Y', $date_start) + $i;
    // Liste des jours feriés
    $arr_bank_holidays[] = '1_1_'.$year; // Jour de l'an
    $arr_bank_holidays[] = '1_5_'.$year; // Fete du travail
    $arr_bank_holidays[] = '8_5_'.$year; // Victoire 1945
    $arr_bank_holidays[] = '14_7_'.$year; // Fete nationale
    $arr_bank_holidays[] = '15_8_'.$year; // Assomption
    $arr_bank_holidays[] = '1_11_'.$year; // Toussaint
    $arr_bank_holidays[] = '11_11_'.$year; // Armistice 1918
    $arr_bank_holidays[] = '25_12_'.$year; // Noel
    // Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote
    $easter = easter_date($year);
    $arr_bank_holidays[] = date('j_n_'.$year, $easter + 86400); // Paques
    $arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400*39)); // Ascension
    $arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400*50)); // Pentecote
    }
    $nb_days_open = 0;
    // on rajoute +1 jour a la date_start vu que le 1er jour est deja calculé et idem pour le dernier jour
    $date_start = $date_start + 86400;    
    $date_stop = $date_stop - 86400;
    while ($date_start <= $date_stop) {
    // Si le jour suivant n'est ni un dimanche (0) ou un samedi (6), ni un jour férié, on incrémente les jours ouvrés
    if (!in_array(date('w', $date_start), array(0, 6))
    && !in_array(date('j_n_'.date('Y', $date_start), $date_start), $arr_bank_holidays)) {
    $nb_days_open++;
    }
    $date_start = mktime(date('H', $date_start), date('i', $date_start), date('s', $date_start), date('m', $date_start), date('d', $date_start) + 1, date('Y', $date_start));
    }
    $nb_jours_ouvres = $nb_days_open ;
    echo "<br> jour ouvrés : ".$nb_jours_ouvres ;
    echo "<br> nb heure du 1er jour : ".$nb_heure_first_jour ;  
    echo "<br> nb_heure_last_jour : ".$nb_heure_last_jour ;      
    $nb_heures_ouvres = $nb_jours_ouvres * $opentime + ($nb_second_first_et_last_jour /3600);
   
    return $nb_heures_ouvres;
    }
   
   
    $date_depart = '2012-08-14 12:00:00';
    $date_fin = '2012-08-16 18:00:00';
    $nb_heures_ouvres = get_nb_open_hours($date_depart, $date_fin) ;
   
    echo '<br><br>Il y a '.$nb_heures_ouvres.' heures ouvr&eacute;s  entre le '.$date_depart.' et le '.$date_fin ;
    ?>


 

#30 Forum Général PHP » [Procédure stocké ] Calcul d'heure sur une base de 11h (et non 24h) » 22-08-2012 00:32:07

ebouilleur
Réponses : 8

Bonjour,

J'ai récupérer une fonction sql qui permet de calculer le nombre d'heure entre 2 dates. Cette fonction ne fonctionne pas sur une base de 24h, mais sur une base de 11h (soit les heures ouvrées : 8h à 19h)

Je dois passer cette fonction sur mysql, mais j'ai qq soucis

Voila la fonction sql server :


USE [IndicateursNoviaServ]
GO
/****** Object:  UserDefinedFunction [dbo].[CalculerDuree]    Script Date: 08/08/2012 08:54:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[CalculerDuree](
@start_date DATETIME ,
@end_date DATETIME )

RETURNS INT

AS

BEGIN
declare @begin_time datetime
declare @end_time datetime
declare @bdate datetime
declare @edate datetime
declare @nbFerie int
declare @startDate datetime
declare @endDate datetime
set @begin_time = '8:00:00'
set @end_time = '19:00:01'
set @startDate = @Start_date
set @endDate = @end_date
if DATEPART(hour, @start_date) <  DATEPART(Hour, @begin_time) begin set @startDate = CAST(convert(varchar, @start_date, 111) +' '+ @begin_time as datetime)  end
if DATEPART(hour, @start_date) > DATEPART(Hour, @end_time)   begin set @startDate = CAST(convert(varchar, @start_date, 111) +' '+ @end_time as datetime) end
if DATEPART(hour, @end_date) < DATEPART(Hour, @begin_time)  begin set @endDate = CAST(convert(varchar, @end_date, 111) +' '+ @begin_time as datetime) end
if DATEPART(hour, @end_date) > DATEPART(Hour, @end_time)   begin set @endDate = CAST(convert(varchar, @end_date, 111) +' '+ @end_time as datetime) end
IF DATEPART ( WEEKDAY , @endDate + @@DATEFIRST - 1) = 6 begin set @endDate =  CAST(CONVERT(varchar, DATEADD(day,-1, @endDate),111)+' '+@end_time as datetime) end
set @bdate = dateadd(day, datediff(day, 0, @startDate), 0)
set @edate = dateadd(day, datediff(day, 0, @endDate), 0)
set @nbFerie = (SELECT COUNT(*) FROM dbo.DatesFerie WHERE DateFerie BETWEEN @startDate AND @endDate)


RETURN

( SELECT ((total_days / 7) * 5 + total_days % 7 -
CASE WHEN 6 BETWEEN start_weekday AND end_weekday
THEN 1 ELSE 0 END -
CASE WHEN 7 BETWEEN start_weekday AND end_weekday
THEN 1 ELSE 0 END ) * 39600 - DATEDIFF(second, @bdate + @begin_time, @startDate) - DATEDIFF(second, @endDate, @edate + @end_time) - (@nbFerie * 36000)
FROM ( SELECT total_days, start_weekday,
start_weekday + total_days % 7 - 1
FROM ( SELECT DATEDIFF ( day , @startDate, @endDate) + 1,
DATEPART ( WEEKDAY , @startDate + @@DATEFIRST - 1)
) AS T(total_days, start_weekday)
) AS D(total_days, start_weekday, end_weekday)
);

END


 

Et voila ce que j'ai pour le moment fait en mysql :


DELIMITER $$
CREATE
FUNCTION `CalculerDuree`(
start_date DATETIME ,
end_date DATETIME )

RETURNS INT

BEGIN
declare begin_time datetime;
declare end_time datetime ;
declare bdate datetime ;
declare edate datetime ;
declare nbFerie int ;
declare startDate datetime ;
declare endDate datetime;
set begin_time = '8:00:00' ;
set end_time = '19:00:01';
set startDate = start_date ;
set endDate = end_date ;
if DATEPART(hour, start_date) <  DATEPART(Hour, begin_time) then set startDate = CAST(convert(char, start_date, 111) +' '+ begin_time as datetime)  end if;
if DATEPART(hour, start_date) > DATEPART(Hour, end_time)   then set startDate = CAST(convert(char, start_date, 111) +' '+ end_time as datetime) end if;
if DATEPART(hour, end_date) < DATEPART(Hour, begin_time)  then set endDate = CAST(convert(char, end_date, 111) +' '+ begin_time as datetime) end  if;
if DATEPART(hour, end_date) > DATEPART(Hour, end_time)   then set endDate = CAST(convert(char, end_date, 111) +' '+ end_time as datetime) end  if;
IF DATEPART ( WEEKDAY , endDate + @@DATEFIRST - 1) = 6 then set endDate =  CAST(CONVERT(char, DATEADD(day,-1, endDate),111)+' '+end_time as datetime) end  if;
set bdate = dateadd(day, datediff(day, 0, startDate), 0) ;
set edate = dateadd(day, datediff(day, 0, endDate), 0) ;

RETURN

( SELECT ((total_days / 7) * 5 + total_days % 7 -
CASE WHEN 6 BETWEEN start_weekday AND end_weekday
THEN 1 ELSE 0 END -
CASE WHEN 7 BETWEEN start_weekday AND end_weekday
THEN 1 ELSE 0 END ) * 39600 - DATEDIFF(second, bdate + begin_time, startDate) - DATEDIFF(second, endDate, edate + end_time)
FROM ( SELECT total_days, start_weekday,
start_weekday + total_days % 7 - 1
FROM ( SELECT DATEDIFF ( day , startDate, endDate) + 1,
DATEPART ( WEEKDAY , startDate + @@DATEFIRST - 1)
) AS T(total_days, start_weekday)
) AS D(total_days, start_weekday, end_weekday)
);

END


 

Là ca coince à la ligne 22 : #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 ' start_date, 111) +' '+ begin_time as datetime) end if; if DATEPART(hour, star' at line 22

Je continu de chercher, mais si vous avez des idées, suggestion, etc je suis preneur wink

merci

Edit 12h:
Bon, a priori convert() en sql server et mysql ne sont pas les même choses, super ^^
Enfin, je n'ai pas besoin du convert je pense, car ma date ici sera deja au bon format AAAA-MM-JJ hh:mm:ss

Edit 16h:
J'ai du mal a comprendre ce que fait la ligne suivante, avez vous une idée?


startDate = CAST(start_date +' '+ begin_time as datetime)
 

#31 Re : Forum Général PHP » Créer un tableau dynamique complexe » 18-08-2012 13:13:16

Je crois que je vais essayer de changer ma table pour que le traitement soit plus simple...

#32 Re : Forum Général PHP » Créer un tableau dynamique complexe » 18-08-2012 13:13:16

Salut,

Tu as modifié quoi a 14h? juste le LEFT JOIN qui est devenu INNER JOIN ou autre chose?

Sinon je suis dessus depuis 14h, il y avait des truc a corrigé car ta requete (tel quelle) me sortait 500 lignes (alors que j'ai en gros 50 enregistrements ^^

Bon le mieux que j'ai pour le moment c'est avec ca :


SELECT t0.equipe, t0.nom_tech, t1.calc AS urgent, t2.calc AS express, t3.calc AS courte, t4.calc AS moyenne, t5.calc AS longue, t6.calc as total FROM
stats_svsi_clos AS t0 INNER JOIN
(SELECT equipe, nom_tech, SUM(nb_intervention) AS calc FROM stats_svsi_clos WHERE jour='2012-7-30' AND priorite=1 GROUP BY equipe,nom_tech,nb_intervention ORDER BY equipe) AS t1 ON (t0.equipe=t1.equipe AND t0.nom_tech=t1.nom_tech)
INNER JOIN
(SELECT equipe, nom_tech, SUM(nb_intervention) AS calc FROM stats_svsi_clos WHERE jour='2012-7-30' AND priorite=2 GROUP BY equipe,nom_tech,nb_intervention ORDER BY equipe) AS t2 ON (t0.equipe=t2.equipe AND t0.nom_tech=t2.nom_tech)
INNER JOIN
(SELECT equipe, nom_tech, SUM(nb_intervention) AS calc FROM stats_svsi_clos WHERE jour='2012-7-30' AND priorite=3 GROUP BY equipe,nom_tech,nb_intervention ORDER BY equipe) AS t3 ON (t0.equipe=t3.equipe AND t0.nom_tech=t3.nom_tech)
INNER JOIN
(SELECT equipe, nom_tech, SUM(nb_intervention) AS calc FROM stats_svsi_clos WHERE jour='2012-7-30' AND priorite=4 GROUP BY equipe,nom_tech,nb_intervention ORDER BY equipe) AS t4 ON (t0.equipe=t4.equipe AND t0.nom_tech=t4.nom_tech)
INNER JOIN
(SELECT equipe, nom_tech, SUM(nb_intervention) AS calc FROM stats_svsi_clos WHERE jour='2012-7-30' AND priorite=5 GROUP BY equipe,nom_tech,nb_intervention ORDER BY equipe) AS t5 ON (t0.equipe=t5.equipe AND t0.nom_tech=t5.nom_tech)
INNER JOIN
(SELECT equipe, nom_tech, SUM(nb_intervention) AS calc FROM stats_svsi_clos WHERE jour='2012-7-30' GROUP BY equipe,nom_tech ORDER BY equipe) AS t6 ON (t0.equipe=t6.equipe AND t0.nom_tech=t6.nom_tech)
WHERE t0.jour='2012-7-30'
GROUP BY t0.equipe, t0.nom_tech, urgent, express , courte, moyenne, longue, total WITH ROLLUP
 

J'ai je crois juste supprimé le "nb_intervention" du GROUP BY de la reque t6
MAIS je n'ai le résultat que pour 1 seul tech sur 1 seul site...
Alors que chaque requête lancé indépendamment me donne bien pour tous les tech et tous les sites, en image :
1158496771.jpg

#33 Re : Forum Général PHP » Créer un tableau dynamique complexe » 18-08-2012 13:13:16

OK, donc si j'ai bien compris, le ROLLUP me permet de faire les calcules des lignes Total de mon tableau, en faisant une requete du genre :


SELECT nb_intervention, nom_tech, equipe, priorite, SUM( nb_intervention )
FROM stats_svsi_clos
WHERE jour = '2012-7-30'
GROUP BY equipe, nom_tech, priorite
WITH ROLLUP
 

a priori ça fonctionne bien

J'essaye deja dans un 1er temsp d'afficher les lignes pour une meme equipe, sans total ni rien, et je bloque, je n'obtient pas ce que je voudrais... est ce que je dois bien faire qqchose du genre :


SELECT s1.nb_intervention, s2.nb_intervention, s3.nb_intervention, s4.nb_intervention, s1.nom_tech, s1.equipe
FROM stats_svsi_clos AS s1
LEFT JOIN stats_svsi_clos AS s2 ON (s1.jour=s2.jour)
LEFT JOIN stats_svsi_clos AS s3 ON (s1.jour=s3.jour)
LEFT JOIN stats_svsi_clos AS s4 ON (s1.jour=s4.jour)
WHERE s1.priorite='1' AND s2.priorite='2' AND s3.priorite='3' AND s4.priorite='4' AND s1.jour='2012-7-30' AND s1.equipe='Paris'
GROUP BY s1.equipe, s1.nom_tech
 

#34 Re : Forum Général PHP » Créer un tableau dynamique complexe » 18-08-2012 13:13:16

Salut,

Oui je reviens de vacances ^^ (et j'ai pas mal de boulot, j'ai meme pas le temps de travailler pour moi sad )
non je n'ai pas mis de clé id, mais je peux en rajouter s'il le faut.
En fait le contenu de cette table est est "résumé" d'une autre bcp plus grosse dont j'en extrait ce qui m'intéresse. La table est minuscule pour le moment, mais va gagner environ 50 enregistrements par jour.
je ne connais pas WITH ROLLUP, mais je vais y jetter un oeil wink
Merci

#35 Forum Général PHP » Créer un tableau dynamique complexe » 18-08-2012 13:13:16

ebouilleur
Réponses : 10

Bonjour,

Je dois créer un tableau dynamique via des informations de ma bdd, mais je ne sais pas trop comment m'y prendre pour faire sa proprement.
Je vous montre ça, ca vous permettra de bien comprendre.

le tableau finalement que je souhaiterai :
tableau

Ma base de donnée qui est de la forme :


CREATE TABLE IF NOT EXISTS `stats_clos` (
  `nb_intervention` int(10) unsigned NOT NULL,
  `nom_tech` varchar(50) NOT NULL,
  `equipe` varchar(150) NOT NULL,
  `priorite` smallint(5) unsigned NOT NULL,
  `jour` date NOT NULL,
  KEY `nb_intervention` (`nb_intervention`,`priorite`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 

Comment faire pour avoir un tableau comme ci-dessus, avec un code propre (pas 50 requetes sql j'entend). (Pour info, un user peut être dans plusieurs équipes)

Voici le "début" de code qui ne sert pas a grand chose ... :


            <h1>Clôture par site, par techniciens et par priorité</h1>
            <?php  
            $sql1="SELECT * FROM stats_clos WHERE jour='2012-07-06' ORDER BY equipe DESC";    
            $req1 = mysql_query($sql1) or die('Erreur SQL stats_svsi_clos : <br />'.$sql1.'<br>'.mysql_error());                  
            while($array_res = mysql_fetch_array($req1)){                            
                $equipe = $array_res['equipe'];

            }                
            ?>            
            <table style="text-align:center">
              <tr>
                <td style="width:100px" class="cellule_red"><b>Groupe d'affectation</b></td>
                <td style="width:100px" class="cellule_red"><b>Technicien</b></td>
                <td style="width:100px" class="cellule_red"><b>Urgente</b></td>
                <td style="width:100px" class="cellule_red"><b>Express</b></td>
                <td style="width:100px" class="cellule_red"><b>Courte</b></td>
                <td style="width:100px" class="cellule_red"><b>Moyenne</b></td>
                <td style="width:100px" class="cellule_red"><b>Longue</b></td>
                <td style="width:100px" class="cellule_red"><b>Total</b></td>
              </tr>


            </table>
 

Je ne sais pas trop si je dois traiter toutes les infos dans mon while avant mon tableau ou dans la tableau (je pense que ca doit etre fait dans la tableau sinon ca ne sera pas propre)
un gros coup de main svp?
merci

#36 Re : Forum Général PHP » Requete sql qui bug » 20-05-2012 15:49:43

Oui oui, je suis bien concient de tout ca.
J'utilise une table memory ici, car c'est dans le même style que pour mes courses et mon cron, donc c'est pour ca que j'ai dis que j'ai fait comme tu m'avais conseillé wink
Je ne fais pas ca tout le temps ^^

#38 Re : Forum Général PHP » Requete sql qui bug » 20-05-2012 15:49:43

Bonsoir,

Petite question JC (ou pour qui pourra me dire)

Quand je fais ce qu'on a vu ensemble, cad la création d'un table memory pour tout gérer, comment je peux faire pour faire un INSERT "précis".
je met tout le code mais seul le 2eme morceau me pose soucis :


  // création de la table memory pr les défis a réaliser
  $requete="CREATE TABLE `m_defis3` (
        `id` int(10) unsigned NOT NULL auto_increment,
        `id_defis` int(10) unsigned NOT NULL,
        `id_pseudo` int(10) unsigned NOT NULL,
        `id_gerant` int(10) unsigned NOT NULL,  
        `id_employe_gagnant` int(10) unsigned NOT NULL,
        `invest_du_parieur` int(10) unsigned NOT NULL,    
        `gain_du_parieur` int(10) unsigned NOT NULL,
        `gain_gerant` int(10) unsigned NOT NULL,
        PRIMARY KEY (`id`),
        KEY `idx_defis` (`id_defis`),
        KEY `idx_pseudo` (`id_pseudo`)    
      ) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci"
;
  $result = mysql_query($requete);
  if ($result===false){throw new Exception("Erreur de création de la table memory defis3",E_USER_NOTICE);}

  $sql7 = "INSERT INTO m_defis3 (id_defis, id_pseudo, id_gerant, id_employe_gagnant, invest_du_parieur, gain_du_parieur, gain_gerant)
          SELECT p1.id_defis, p1.id_pseudo, pm.id_pseudo, d.employe_gagnant, p1.somme, calc_gain_parieur(p1.somme,p2.somme_mise_gagnant,p3.somme_mise_perdant,d.employe_gagnant,p1.id_employe),
            (p3.somme_mise_perdant - (p3.somme_mise_perdant*90/100))          
          FROM defis_paris AS p1
          LEFT JOIN defis AS d ON (p1.id_defis=d.id )
          LEFT JOIN perso_masseur AS pm ON (pm.id=d.employe_gagnant )      
          LEFT JOIN (
            SELECT id_defis, sum(somme) as somme_mise_gagnant
            FROM defis_paris
            INNER JOIN defis ON (defis_paris.id_employe=defis.employe_gagnant AND defis_paris.id_defis=defis.id)
            GROUP BY defis_paris.id_defis        
          ) AS p2 ON (p1.id_defis=p2.id_defis)
          LEFT JOIN (
            SELECT id_defis, sum(somme) as somme_mise_perdant
            FROM defis_paris
            INNER JOIN defis ON (defis_paris.id_employe!=defis.employe_gagnant AND defis_paris.id_defis=defis.id)  
            GROUP BY defis_paris.id_defis        
          ) AS p3 ON (p1.id_defis=p3.id_defis)        
          WHERE d.statut=3
        "
;    
  $result = mysql_query($sql7);
  if ($result===false){throw new Exception("Erreur de remplissage de la table memory defis3",E_USER_NOTICE);}        
  if (mysql_affected_rows()>0){
 
    // on distribue les gains au parieurs
    $sqlUp = "UPDATE perso, m_defis3
              SET perso.argent=(perso.argent + m_defis3.gain_du_parieur)
              WHERE perso.id_pseudo=m_defis3.id_pseudo "
;
    $result = mysql_query($sqlUp);  
    if ($result===false){throw new Exception("MAJ argent gagnant du defi <br>$sqlUp<br>".mysql_error()."",E_USER_NOTICE);}
 
    // on distribue les gains au gérant
    $sqlUp = "UPDATE perso, m_defis3
              SET perso.argent=(perso.argent + m_defis3.gain_gerant)
              WHERE perso.id_pseudo=m_defis3.id_gerant "
;
    $result = mysql_query($sqlUp);  
    if ($result===false){throw new Exception("MAJ argent gérant du defi <br>$sqlUp<br>".mysql_error()."",E_USER_NOTICE);}
     
 

Et voila ce que j'arrive pas a faire. Peux etre qu'on ne peut tout simplement pas le faire comme ca ^^


    // msg pour le gagnant
    $msg_contenu = "Vous avez gagner un défi. Vous avez reçu : $gain_pr_gagant €.";

    $sqlUp = "INSERT INTO msg VALUES ('','20','Défi gagné','$msg_contenu','$jour_heure','0')
              WHERE msg.id_destinataire=m_defis3.id_gerant "
;
    $result = mysql_query($sqlUp);  
    if ($result===false){throw new Exception("MAJ argent gérant du defi <br>$sqlUp<br>".mysql_error()."",E_USER_NOTICE);}
 

Comment faire pour que $gain_pr_gagant est la valeur que je veux (et qui biensur est présente dans ma table m_defis3 ?

Merci

#39 Re : Forum Général PHP » Requete sql qui bug » 20-05-2012 15:49:43

Merci wink
il me manquait aussi un GROUP BY

Eh oui, j'essaye de réutiliser tout ce qu'on a vu ensemble, meme si des fois je m'enbrouille
Merci

#40 Forum Général PHP » Requete sql qui bug » 20-05-2012 15:49:43

ebouilleur
Réponses : 8

Bonjour,

Je suis confronté a une erreur sql, dont je ne trouve pas le soucis.

Voici ma requete :

     
        INSERT INTO m_defis3 (id_defis, id_pseudo, id_employe_gagnant, invest_du_parieur, gain_du_parieur)
        SELECT p1.id_defis, p1.id_pseudo, d.employe_gagnant, p1.somme, calc_gain_parieur(p1.somme,p2.somme_mise_gagnant,p3.somme_mise_perdant)
         
        FROM defis_paris AS p1
        INNER JOIN defis AS d ON (p1.id_defis=d.id )    
        LEFT JOIN (
          SELECT sum(somme) as somme_mise_gagnant
          FROM defis_paris
          LEFT JOIN defis ON (defis_paris.id_employe=defis.employe_gagnant AND defis_paris.id_defis=defis.id)        
        ) AS p2 ON (p1.id_defis=p2.id_defis)
        LEFT JOIN (
          SELECT sum(somme) as somme_mise_perdant
          FROM defis_paris
          LEFT JOIN defis ON (defis_paris.id_employe!=defis.employe_gagnant AND defis_paris.id_defis=defis.id)
        ) AS p3 ON (p1.id_defis=p3.id_defis)        
        WHERE d.statut=5
 

L'erreur donnée par phpmyadmin est : #1054 - Unknown column 'p2.id_defis' in 'on clause'
Je comprend l'erreur, mais je ne vois pas pourquoi il me sert ca... id_defis existe bien dans la table defis_paris

Pour info m_defis3 est un table memory juste créé pour faire des calcules

Les autres tables sont :

--
-- Structure de la table `defis`
--

CREATE TABLE IF NOT EXISTS `defis` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `date_defis` datetime NOT NULL,
  `statut` tinyint(3) unsigned NOT NULL,
  `employe_gagnant` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `etat` (`statut`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

-- --------------------------------------------------------

--
-- Structure de la table `defis_paris`
--

CREATE TABLE IF NOT EXISTS `defis_paris` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `id_defis` int(10) unsigned NOT NULL,
  `id_employe` int(10) unsigned NOT NULL,
  `id_pseudo` int(10) unsigned NOT NULL,
  `somme` smallint(5) unsigned NOT NULL,
  `jour` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id_defis` (`id_defis`,`id_employe`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

-- --------------------------------------------------------

--
-- Structure de la table `defis_participant`
--

CREATE TABLE IF NOT EXISTS `defis_participant` (
  `id_defis` int(10) unsigned NOT NULL,
  `id_employe` int(10) unsigned NOT NULL,
  `id_pseudo` int(10) unsigned NOT NULL,
  `statut_employe` tinyint(3) unsigned NOT NULL,
  `lanceur` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY  (`id_defis`,`id_employe`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

Enfin je pense que ma requete sql et l'erreur vous suffiront a m'aiguiller
merci d'avance smile

#41 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

L'interet est de faire le calcule d'une distance parcouru et de l'utiliser dans une requete sql wink

ici :

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

Et merci JC, en effet ca fonctionne mieux wink

#42 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

Voila le message d'erreur de pma :


requête SQL:

CREATE DEFINER = `root`@`localhost` FUNCTION `calc_dist` (
strong smallint,
agilite smallint,
intel smallint,
endurance smallint,
temps smallint,
puissance_min smallint,
puissance smallint,
duree smallint,
type_circuit varchar( 1 )
) BEGIN DECLARE c_rand INT;
SET c_rand = FLOOR( -999 + RAND( ) *1998 ) /100;
IF type_circuit = S THEN SET add_competence = strong;
END IF ;
IF type_circuit = A THEN SET add_competence = agilite;
END IF ;
IF type_circuit = I THEN SET add_competence = intel;
END IF ;
IF type_circuit = E THEN SET add_competence = endurance;
END IF ;

RETURN (
(
puissance - ( (
puissance_min + add_competence
) / endurance ) * temps / ( duree *120 )
) * temps + c_rand
);
END

 

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 'BEGIN
DECLARE rand INT;
SET c_rand=FLOOR(-999+RAND()*1998)/100;
    IF type_ci' at line 4

#43 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

J'ai donc mis :
[code)mysql]SET c_rand=FLOOR(-999+RAND()*1998);[/code]
mais j'ai toujours :
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 'BEGIN
DECLARE rand INT;
SET c_rand=FLOOR(-999+RAND()*1998);
    IF type_ci' at line 4

sad

#44 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

pour avoir un nombre aléatoire.
l'idée est de faire la meme chose que ca 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;
}
 

#45 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

J'avais hésité a essayer sans, puis je me suis dis que non..
enfin toujours est il que non ca ne solution pas le probleme. tjs même msg d'erreur

#46 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

Malgré le code modifié, ca me donne tjs la même erreur :


CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_dist`(strong smallint, agilite smallint, intel smallint, endurance smallint, temps smallint, puissance_min smallint, puissance smallint, duree smallint, type_circuit char(1))
RETURNS decimal(6,2)    
BEGIN

DECLARE rand INT;
SET rand = ROUND(-999,999);
   IF type_circuit == 'S' THEN SET add_competence = strong; END IF;
   IF type_circuit == 'A' THEN SET add_competence = agilite; END IF;
   IF type_circuit == 'I' THEN SET add_competence = intel; END IF;
   IF type_circuit == 'E' THEN SET add_competence = endurance; END IF;

RETURN ((puissance-((puissance_min+add_competence)/endurance)*temps/(duree*120))*temps+ rand);
END##
 

#47 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

1)
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 'DECLARE rand INT;
SET rand = ROUND(-999,999);
    IF type_circuit == 'S' THEN S' at line 6

2) le delimiter est bien a ##
3) oui, 2 return... surement un mauvais copier/coller via le forum

#48 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

Salut,
avec du retard, j'essaye donc de faire ma fonction de calcule de distance, avec les améliorations souhaitées, mais phpmyadmin me sert qu'il y a un erreur donc ca n'en veut pas. j'ai essayer de la tourner dans tous les sens et je vois pas le chmilblik... une idée?


CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_dist`(strong smallint, agilite smallint, intel smallint, endurance smallint, temps smallint, puissance_min smallint, puissance smallint, duree smallint, type_circuit char(1))
RETURNS decimal(6,2)    


DECLARE rand INT;
SET rand = ROUND(-999,999);
   IF type_circuit == 'S' THEN SET add_competence = strong; END IF;
   IF type_circuit == 'A' THEN SET add_competence = agilite; END IF;
   IF type_circuit == 'I' THEN SET add_competence = intel; END IF;
   IF type_circuit == 'E' THEN SET add_competence = endurance; END IF;

RETURN ((puissance-((puissance_min+add_competence)/endurance)*temps/(duree*120))*temps+ rand)
RETURN id_gagnant;
END##
 

Merci

#49 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

Merci
smile

La je l'utilise dans une requete :


        INSERT INTO m_defis2 (id_defis, id_employe_expediteur, agressivite_expediteur, id_employe_destinataire, agressivite_destinataire, id_gagnant)
        SELECT t0.id, p1.id_employe, t1.agressivite AS agressivite_expediteur, p2.id_employe, t2.agressivite AS agressivite_destinataire,
          calc_combat2(p1.id_employe, t1.agressivite, p2.id_employe, t2.agressivite) as id_gagnant
        FROM defis AS t0
        INNER JOIN defis_participant AS p1 ON (p1.id_defis=t0.id AND p1.lanceur=1  )
        INNER JOIN defis_participant AS p2 ON (p2.id_defis=t0.id AND p2.lanceur=0  )        
        LEFT JOIN perso_masseur AS t1 ON (t1.id=p1.id_employe)
        LEFT JOIN perso_masseur AS t2 ON (t2.id=p2.id_employe)    
        WHERE t0.statut=2
 

bonne soirée

#50 Re : Forum Général PHP » Trier le résultat d'une requete puis l'afficher comme voulu » 30-04-2012 19:36:15

Bonsoir,

Je n'ai pas eu vraiment le temps de la faire, mais j'ai du en faire une pour un autre site, donc j'ai utiliser ce que tu m'avais dis.
IL faut vraiment que j'arrive à trouver du temps pour crazy pet hmm

Mais je ne colle l'autre que j'ai pu faire grace a ton aide :


CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_combat`(agressivite int)
RETURNS INT
RETURN ROUND(RAND()*agressivite,RAND()*agressivite*10)


CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_combat2`(id_employe_expediteur int,  agressivite_expediteur int, id_employe_destinataire int,  agressivite_destinataire int)
RETURNS INT
BEGIN

DECLARE rand1 INT;
DECLARE rand2 INT;
DECLARE id_gagnant INT;
DECLARE id_perdant INT;

SET rand1 = ROUND(RAND()*agressivite_expediteur,RAND()*agressivite_expediteur*10);
SET rand2 = ROUND(RAND()*agressivite_destinataire,RAND()*agressivite_destinataire*10);

   IF rand1 >= rand2 THEN
      SET id_gagnant = id_employe_expediteur;  
      SET id_perdant = id_employe_destinataire;
   END IF;  
   IF rand1 < rand2 THEN
      SET id_gagnant = id_employe_destinataire;  
      SET id_perdant = id_employe_expediteur;  
   END IF;

INSERT INTO defis_perdu VALUES (id_perdant,'honte',DATE_ADD(NOW(),INTERVAL 1 DAY))

RETURN id_gagnant;
END##
 

Je te tiens au courant
merci

Pied de page des forums

Propulsé par FluxBB