Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete SELECT avec GLPI

    14 mars 2024 à 10:56:14

    Bonjour,

    Je cherche à récuperer le nombre de tickets "en cours" par collaborateurs dans GLPI, le soucis c'est qu'avec GLPI dans la table glpi_tickets_users, il est possible que pour un ticket, il y ait 2 techniciens, si bien que ma requête actuelle va compter 2 tickets au lieu de 1, et fausse donc les résultats.

    Actuellement ma requete est ainsi : 

    $stmt = $dbh->prepare("SELECT * FROM glpi_groups_users LEFT JOIN glpi_users ON glpi_groups_users.users_id = glpi_users.id WHERE glpi_groups_users.groups_id = 3 ORDER BY glpi_users.realname ");
    $stmt->execute(array());
    while ($collaborateurs = $stmt->fetch()) {
    	$getTickets = $dbh->prepare("SELECT * FROM glpi_tickets_users 
    	INNER JOIN glpi_tickets ON glpi_tickets_users.tickets_id = glpi_tickets.id
    	WHERE glpi_tickets_users.users_id = ?
    	AND glpi_tickets_users.type = '2' AND glpi_tickets.status < '5' AND glpi_tickets.is_deleted = '0'");
    	$getTickets->execute(array($collaborateurs['id']));
    	$test = $getTickets->rowCount();
    	
    	$total = $total + $test;
    }
    echo $total;


    En gros, je fais une première requete pour récuperer l'ensemble des collaborateurs qui sont dans le groupe 3 et je boucle tant qu'il y a des utilisateurs puis, je fais une autre requete SQL pour ramener tous les tickets ouverts affectés à cet utilisateur et de l'additionner dans ma variable $total.

    Ma table glpi_tickets_users est ainsi

    On remarque que pour le tickets avec l'id 3, il y a deux techniciens : l'users 2 et l'user 4, donc ma requete va compter deux tickets, au lieu de un. Je cherche à exclure cela, mais je n'y parviens pas.. J'ai essayé avec un DISTINCT mais non plus

    Merci !

    -
    Edité par MGui37 14 mars 2024 à 10:57:28

    • Partager sur Facebook
    • Partager sur Twitter
      14 mars 2024 à 11:03:21

      Salut

      Plutôt que de compter en PHP les résultats d'une requête SELECT * FROM … (avec ->rowCount()), pourquoi ne pas demander à MySQL de compter ? Tu devrais pouvoir utiliser count(DISTINCT glpi_tickets.id) AS number à mon sens.

      Qui plus est, une requête dans une boucle, c'est très souvent rapidement optimisable : tu pourrais avoir le total en une seule requête SQL dans la très grande majorité des cas, le plus souvent en ajoutant une jointure de la requête "externe à la boucle" vers la requête "interne".

      -
      Edité par Ymox 14 mars 2024 à 11:03:45

      • Partager sur Facebook
      • Partager sur Twitter
        14 mars 2024 à 11:17:32

        Merci pour le coup de main ! 

        Effectivement le code n'est pas vraiment optimisé, je suis bien conscient de ça, je débute sur le sujet et c'est vrai que je n'ai pas les pratiques les plus optimates... Si tu as des suggestions de propre je suis prenneur ! :-)

        J'ai modifié le code ainsi, mais j'ai toujours le même soucis avec le résultat faussé

        $stmt = $dbh->prepare("SELECT * FROM glpi_groups_users LEFT JOIN glpi_users ON glpi_groups_users.users_id = glpi_users.id WHERE glpi_groups_users.groups_id = 3 ORDER BY glpi_users.realname ");
        $stmt->execute(array());
        while ($collaborateurs = $stmt->fetch()) {
        	$getTickets = $dbh->prepare("SELECT count(DISTINCT glpi_tickets_users.tickets_id) AS NUMBER FROM glpi_tickets_users 
        	INNER JOIN glpi_tickets ON glpi_tickets_users.tickets_id = glpi_tickets.id
        	WHERE glpi_tickets_users.users_id = ?
        	AND glpi_tickets_users.type = '2' AND glpi_tickets.status < '5' AND glpi_tickets.is_deleted = '0'");
        	$getTickets->execute(array($collaborateurs['id']));
        	$totalTickets = $getTickets->fetch();
        	
        	$total = $total + $totalTickets[0];
        }
        echo $total;

        Encore merci !

        • Partager sur Facebook
        • Partager sur Twitter
          14 mars 2024 à 12:11:09

          En fait, tu souhaites le nombre de tickets assignés, ou le nombre de tickets par utilisateur ? Actuellement, du fait de la contrainte dans la seconde requête, c'est bien la seconde option qui est en place, parce qu'effectivement, un ticket assigné à deux utilisateurs sera compté dans une requête pour un utilisateur, puis dans une autre avec l'autre utilisateur…

          Si jamais, tu as fetchColumn() qui va te retourner directement "la première colonne" du jeu de résultat.

          Si tu veux optimiser, regarde vraiment pour combiner les deux requêtes en une. C'est relativement facile : tu as une clause WHERE dans la seconde qui peut être remplacée par une jointure avec glpi_users.id de la première. Tu peux ne sélectionner que le nombre, cela ira très bien. D'ailleurs, tu aurais pu ne sélectionner que l'ID dans la première requête.  :p

          • Partager sur Facebook
          • Partager sur Twitter
            14 mars 2024 à 12:17:00

            Effectivement je souhaite juste connaitre le nombre de tickets assignés aux techniciens qui appartiennent au groupe "3", puis d'additionner les tickets qui ne sont pas encore affectés à un technicien mais au groupe "3" uniquement, et ce pour pouvoir quantifier "la charge de travail" du groupe

            Il faudrait par contre que je fasse plus d'une jointure du coup si je veux optimiser ? Car ma seconde requete va taper dans plusieurs tables qui ne sont appellées dans la première: il faut donc que je les fusionne en quelque sorte ?

            Je vais voir pour rectifier ma requête, j'apprends sur le tas pour un "projet pro" donc c'est pas évident :-)

            Merci !

            -
            Edité par MGui37 14 mars 2024 à 12:21:19

            • Partager sur Facebook
            • Partager sur Twitter
              17 mars 2024 à 21:44:47 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


              Requete SELECT avec GLPI

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown