Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer entrée précédente SQL

    11 janvier 2019 à 8:48:51

    Bonjour à tous,

    pour sortir une statistique j'ai besoin de récupérer l'entrée précédente concernant un dossier. Je m'explique, une table de la BDD contient l"historique des changements de statut pour des dossiers (en cours, traité, refusé etc...) et pour une statistique j'ai besoin de, par exemple, savoir pour le dossier X qui est désormais traité, si ce même dossier X était en cours avant. Je regroupe ces informations pour afficher le nombre de dossiers traités par telle ou telle personne. 

    Mon problème est que je ne parviens pas à terminer cette requête, je ne trouve pas la bonne manière de faire pour récupérer le statut de l'enregistrement précédent concernant chaque dossier.

    Ma requête ressemble à ça:

    SELECT DISTINCT(CONCAT(u.nom, \' \', u.prenom)) AS operateur, COALESCE(a1.nombre, 0) AS chantiers_traites_conformes, COALESCE(a2.nombre, 0) AS chantiers_traites_non_conformes, COALESCE(a3.nombre, 0) AS chantiers_repris_conformes FROM utilisateurs u
                LEFT JOIN chantier c ON c.id_traitement = u.id 
                LEFT JOIN (SELECT c.id_traitement AS operateur, COUNT(*) AS nombre FROM chantier c LEFT JOIN utilisateurs u ON c.id_traitement = u.id WHERE c.actif = 1 AND c.id in (select h2.id_chantier from historique_chantier h2 where h2.id IN (select max(h1.id) from historique_chantier h1 left join historique_chantier h on h.id_chantier = h1.id_chantier where h1.created < h.created and h.id_statut = 11 and h1.id_statut = 7 GROUP BY h1.id_chantier)) AND c.date_traitement between "'.$date_debut.' 00:00" and "'.$date_fin.' 23:59" GROUP BY c.id_traitement) a1 ON a1.operateur = u.id
                LEFT JOIN (SELECT c.id_traitement AS operateur, COUNT(*) AS nombre FROM chantier c LEFT JOIN utilisateurs u ON c.id_traitement = u.id WHERE c.actif = 1 AND c.id in (select h2.id_chantier from historique_chantier h2 where h2.id IN (select max(h1.id) from historique_chantier h1 left join historique_chantier h on h.id_chantier = h1.id_chantier where h1.created < h.created and h.id_statut = 9 and h1.id_statut = 7 GROUP BY h1.id_chantier)) AND c.date_traitement between "'.$date_debut.' 00:00" and "'.$date_fin.' 23:59" GROUP BY c.id_traitement) a2 ON a2.operateur = u.id
                LEFT JOIN (SELECT c.id_traitement AS operateur, COUNT(*) AS nombre FROM chantier c LEFT JOIN utilisateurs u ON c.id_traitement = u.id WHERE c.actif = 1 AND c.id in (select h2.id_chantier from historique_chantier h2 where h2.id IN (select max(h1.id) from historique_chantier h1 left join historique_chantier h on h.id_chantier = h1.id_chantier where h1.created < h.created and h.id_statut = 11 and h1.id_statut = 9 GROUP BY h1.id_chantier)) AND c.date_traitement between "'.$date_debut.' 00:00" and "'.$date_fin.' 23:59" GROUP BY c.id_traitement) a3 ON a3.operateur = u.id
                WHERE u.id IN ('.implode(", ", $operateurs).') AND u.actif = 1 ORDER BY u.id

    Et la partie qui me pose problème c'est précisément celle là:

    select h2.id_chantier from historique_chantier h2 where h2.id IN (select max(h1.id) from historique_chantier h1 left join historique_chantier h on h.id_chantier = h1.id_chantier where h1.created < h.created and h.id_statut = 11 and h1.id_statut = 7 GROUP BY h1.id_chantier)

    En gros j'essai de faire comme dit précédemment, récupérer l'id de l'enregistrement précédent pour chaque chantier mais ça ne marche absolument pas, ou en  tout cas ça ne fait pas ce que je souhaite.

    J'espère avoir exprimé assez clairement mon problème et que quelqu'un sera en mesure de m'aider car je n'arrive vraiment pas à trouver la requête miracle.

    Merci beaucoup

    • Partager sur Facebook
    • Partager sur Twitter
      11 janvier 2019 à 10:40:27

      Bonjour,

      QuentinSchifferle a écrit:

      Ma requête ressemble à ça

      Ouch ... c'est touffu ... :D

      QuentinSchifferle a écrit:

      la partie qui me pose problème c'est précisément celle là:

      select h2.id_chantier from historique_chantier h2 where h2.id IN (select max(h1.id) from historique_chantier h1 left join historique_chantier h on h.id_chantier = h1.id_chantier where h1.created < h.created and h.id_statut = 11 and h1.id_statut = 7 GROUP BY h1.id_chantier)

      Oui, c'est en effet très (trop) tordu ...

      Peux-tu détailler un peu plus le fonctionnement de l'application, et notamment l'enchaînement des statuts, peut-être avec un exemple de données pour un id_chantier ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

      Récupérer entrée précédente SQL

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown