1 seule requete preparee pour un select et deux count

Petit nouveau ! | 2 Messages

19 avr. 2019, 13:38

Bonjour à tous,

Depuis quelques mois, je suis entrain de développer un petite interface web pour le boulot. Jusqu'à maintenant j'ai toujours trouvé les solutions à mon ou mes problèmes mais en ce moment je bute sur une requête multiple.

le but: Après avoir rempli un formulaire, en choisissant Deux Services (Achat, Comm), une DATE de début et une DATE de fin concernant la table demande_interplay l'utilisateur pourra voir le compte par mois et par service sous la forme dans un graphique grâce à chartjs.

La table 'Demande_interplay' à plusieurs champs :

- Services (varchar)

- Date_time (datetime)

J'ai réussi à créer ma requête lorsque je sélectionne 1 service, le graphique s'affiche correctement.

voici mon code pour 1 service :

          $chart_x ="";
          $chart_y ="";
          $req_chart = $bdd->prepare("SELECT COUNT(*) AS nb_demande, DATE_FORMAT(date_time,'%m-%y') AS mois_annee from demande_interplay WHERE services= :services_chart AND date_time BETWEEN :date_in_chart AND :date_out_chart GROUP BY mois_annee");
          $req_chart->bindValue(':services_chart', $services_chart, PDO::PARAM_STR);
          $req_chart->bindValue(':date_in_chart', $date_in_chart, PDO::PARAM_STR);
          $req_chart->bindValue(':date_out_chart', $date_out_chart, PDO::PARAM_STR);
          $req_chart->execute();<br>          $result_chart = $req_chart->fetchall(PDO::FETCH_ASSOC);
          foreach($result_chart as $string_chart => $string_chart_seg)
          {
/**Je recupere deux strings un pour l'ordonnée avec le count par mois et un pour l'abscisse avec mes dates de début et de fin en mode 'mois_annee' **/
          $chart_x .= $string_chart_seg['mois_annee']."', '";
          $chart_y .= $string_chart_seg['nb_demande'].", ";
 
          }
          $req_chart->closeCursor();
Par contre quand je sélectionne 2 services, ma requête me renvoie un count total par service sur tous les mois. Mes deux GROUP BY sur les requetes 'count' ne fonctionnent pas.
          $chart_x_1 ="";
          $chart_y_1 ="";
          $chart_y_2 ="";
          $req_chart_1 = $bdd->prepare("SELECT DATE_FORMAT(date_time,'%m-%y') AS mois_annee,
            (SELECT COUNT(services) from demande_interplay WHERE services= :services_chart_1 AND date_time BETWEEN :date_in_chart AND :date_out_chart GROUP BY mois_annee) AS nb_demande_1,
            (SELECT COUNT(services) from demande_interplay WHERE services= :services_chart_2 AND date_time BETWEEN :date_in_chart AND :date_out_chart GROUP BY mois_annee) AS nb_demande_2
            from demande_interplay WHERE date_time BETWEEN :date_in_chart AND :date_out_chart GROUP BY mois_annee ");
          $req_chart_1->bindValue(':services_chart_1', $services_chart_1, PDO::PARAM_STR);
          $req_chart_1->bindValue(':services_chart_2', $services_chart_2, PDO::PARAM_STR);
          $req_chart_1->bindValue(':date_in_chart', $date_in_chart, PDO::PARAM_STR);
          $req_chart_1->bindValue(':date_out_chart', $date_out_chart, PDO::PARAM_STR);
          //$req_chart_1->bindValue(':workflow_chart', $workflow_chart, PDO::PARAM_STR);
          //
          $req_chart_1->execute();
          $result_chart_1 = $req_chart_1->fetchall(PDO::FETCH_ASSOC);
          foreach($result_chart_1 as $string_chart_1 => $string_chart_seg_1)
          {
/**Je recupere 3 strings, deux pour l'ordonnée avec le count par mois et par service et un pour l'abscisse avec mes dates de début et de fin en mode 'mois_annee' **/
          $chart_x_1 .= $string_chart_seg_1['mois_annee']."', '";
          $chart_y_1 .= $string_chart_seg_1['nb_demande_1'].", ";
          $chart_y_2 .= $string_chart_seg_1['nb_demande_2'].", ";
          }<br>          $req_chart_1->closeCursor();
Est ce possible de faire ça une seule requête?

J'espere que j'ai été assez claire et pas trop long.... :?

Cordialitude,

Codecodecodec

Petit nouveau ! | 2 Messages

19 avr. 2019, 16:41

Pour faire suite à mon problème, j'ai trouvé une solution avec les transactions.

Ceci est ma première transaction de ma life et je sens que ce code peut être mieux écrit, optimisé , si vous avez des suggestions, je suis preneur ....

voici le code:
          $chart_x_1 ="";
          $chart_y_1 ="";
          $chart_y_2 ="";

      try {
            $bdd->beginTransaction();

            $req_chart_1 = $bdd->prepare("SELECT DATE_FORMAT(date_time,'%m-%y') AS mois_annee, COUNT(*) AS nb_demande_1 FROM demande_interplay WHERE services= :services_chart_1 AND date_time BETWEEN :date_in_chart AND :date_out_chart GROUP BY mois_annee");
            $req_chart_1->bindValue(':services_chart_1', $services_chart_1, PDO::PARAM_STR);
            $req_chart_1->bindValue(':date_in_chart', $date_in_chart, PDO::PARAM_STR);
            $req_chart_1->bindValue(':date_out_chart', $date_out_chart, PDO::PARAM_STR);
            $req_chart_1->execute();

            $result_chart_1 = $req_chart_1->fetchall(PDO::FETCH_ASSOC);
            foreach($result_chart_1 as $string_chart_1 => $string_chart_seg_1)
            {
            $chart_x_1 .= $string_chart_seg_1['mois_annee']."', '";
            $chart_y_1 .= $string_chart_seg_1['nb_demande_1'].", ";
            }


            $req_chart_2 = $bdd->prepare("SELECT DATE_FORMAT(date_time,'%m-%y') AS mois_annee, COUNT(*) AS nb_demande_1 FROM demande_interplay WHERE services= :services_chart_2 AND date_time BETWEEN :date_in_chart AND :date_out_chart GROUP BY mois_annee");
            $req_chart_2->bindValue(':services_chart_2', $services_chart_2, PDO::PARAM_STR);
            $req_chart_2->bindValue(':date_in_chart', $date_in_chart, PDO::PARAM_STR);
            $req_chart_2->bindValue(':date_out_chart', $date_out_chart, PDO::PARAM_STR);
            $req_chart_2->execute();

            $result_chart_2 = $req_chart_2->fetchall(PDO::FETCH_ASSOC);
            foreach($result_chart_2 as $string_chart_2 => $string_chart_seg_2)
            {
            $chart_y_2 .= $string_chart_seg_2['nb_demande_1'].", ";
            }

            $bdd->commit();
          }
          catch(PDOException $e)
          {
          $bdd->rollback();
          echo $e->getMessage();
          }
Cordialigieusement,

Codecodecodec