You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2016-07-27 13:18:49

locehen
Member
From: Bastia/Biguglia
Registered: 2012-07-31
Posts: 134

Petite aide pour une Requete SQL

Bonjour à tous,

Je souhaiterai pouvoir récupérer la liste des tickets rattachés aux demandeurs si c'est dernier ont plus d'un ticket ouverts, du coup sans rentrer dans les détails de la requête (si ticket non clos-non résolus, et si demandeurs) la simple requête suivante ne marche pas :
SELECT * FROM glpi_tickets join glpi_tickets_users on glpi_tickets.id = glpi_tickets_users.tickets_id where (COUNT(glpi_tickets_users_id)>1)

Si quelqu'un de calé peut me donner un coup de pouce.

Merci smile

Offline

#2 2016-07-27 15:36:19

noircc
Member
Registered: 2015-10-09
Posts: 51

Re: Petite aide pour une Requete SQL

Salut,

La 1er erreur est qu'il n'y a pas de table glpi_tickets_users_id . Tu as mis un underscore au lieu d'un point glpi_tickets_users.id

Essaye un truc comme ça (ça c'est pour un utilisateur que tu défini) :

SELECT * FROM glpi_tickets join glpi_tickets_users on glpi_tickets.id = glpi_tickets_users.tickets_id where glpi_tickets_users.users_id = (SELECT ID FROM glpi_users where name = "xxxxxx") AND glpi_tickets.status < 5;

Remplace xxxxx par un sAMAccountName (Toto DUPONT = tdupont).

++

Last edited by noircc (2016-07-27 15:43:33)

Offline

#3 2016-07-27 15:49:31

locehen
Member
From: Bastia/Biguglia
Registered: 2012-07-31
Posts: 134

Re: Petite aide pour une Requete SQL

Merci noircc de ton aide smile
J'ai essayé autre chose mais c'est toujours la condition (si les utilisateurs ont plus d'un ticket assignés) :
SELECT *  FROM glpi_tickets, glpi_tickets_users WHERE (status != "5" and status != "6") && glpi_tickets_users.tickets_id = glpi_tickets.id && glpi_tickets_users.type = 1  order by glpi_tickets_users.users_id
peut-etre as tu ma reponse smile mais il me faut pour tous les utilisateurs de la bdd... car je vais ensuite lister ces tickets.

Offline

#4 2016-07-28 12:37:43

noircc
Member
Registered: 2015-10-09
Posts: 51

Re: Petite aide pour une Requete SQL

re,

Cela ne va peut être pas te servir mais je suis plus PowerShell donc voici un code qui fonctionne smile :

1er partie : Liste les utilisateurs de la table "Glpi_users" qui sont en demandeur d'au moins 1 ticket.
2eme partie : Compte le nombre de ticket par utilisateur, qui ne sont pas résolu/fermé, ne prend en compte pour la suite que ceux ayant plus d'1 ticket d'ouvert.
3eme partie : Export certaines infos (entities_id, name, date, status) des tickets des utilisateurs sélectionnés ci-dessus dans un fichier texte


[void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")

$port = "3306"
$srv= "127.0.0.1"
$user = "xxxxxx"
$mdp = "xxxxxxxxx"

function DATABASE
    {    
    $cn = New-Object MySql.Data.MySqlClient.MySqlConnection
    $cn.ConnectionString = "server=$srv;port=$port;uid=$user;pwd=$mdp;database=glpi"
    $cn.Open()
    $cm = New-Object -TypeName MySql.Data.MySqlClient.MySqlCommand
        
    $sql = 'SELECT distinct(a.name) as "NomUsers" from glpi_users as a, glpi_tickets_users as b where a.id = b.users_id && b.type = 1'
    $cm.Connection = $cn
    $cm.CommandText = $sql
    $dr = $cm.ExecuteReader()
    while ($dr.Read())
        {
        $name += $dr.GetValue($1)+";"
        }    
    $cn.Close()
    
    $names = $name.split(";")
    
    foreach ($users in $names)
        {
        $sql2 = 'SELECT COUNT(*) FROM glpi_tickets join glpi_tickets_users on glpi_tickets.id = glpi_tickets_users.tickets_id where glpi_tickets_users.users_id = (SELECT ID FROM glpi_users where name = "'+$users+'") AND glpi_tickets.status < 5 AND glpi_tickets_users.type = 1'
        $cn2 = New-Object MySql.Data.MySqlClient.MySqlConnection
        $cn2.ConnectionString = "server=$srv;port=$port;uid=$user;pwd=$mdp;database=glpi"
        $cn2.Open()
        $cm2 = New-Object -TypeName MySql.Data.MySqlClient.MySqlCommand
        $cm2.Connection = $cn2
        $cm2.CommandText = $sql2
        $dr2 = $cm2.ExecuteReader()
        while ($dr2.Read())
            {
            $ticket = $dr2.GetValue($1)
            if ($ticket -gt 1)
                {
                $result = $users+" a "+$ticket+" ticket(s) non resolu"
                $result
                
                $usersticket += $users+";"
                }
            }
        $cn2.Close()
        }
    
    $usertickets = $usersticket.split(";")
    
    $hello = "Nom utilisateur" + ";" + "entities_id" + ";" + "titre du ticket" + ";" + "date d ouverture" + ";" + "status" 
    $hello | Out-File C:\Users\Administrateur\Desktop\test.txt
    
    foreach ($userstickets in $usertickets)
        {
        $sql3 = 'SELECT entities_id, name, date, status FROM glpi_tickets join glpi_tickets_users on glpi_tickets.id = glpi_tickets_users.tickets_id where glpi_tickets_users.users_id = (SELECT ID FROM glpi_users where name = "'+$userstickets+'") && glpi_tickets.status < 5 && glpi_tickets_users.type = 1'
        $cn3 = New-Object MySql.Data.MySqlClient.MySqlConnection
        $cn3.ConnectionString = "server=$srv;port=$port;uid=$user;pwd=$mdp;database=glpi"
        $cn3.Open()
        $cm3 = New-Object -TypeName MySql.Data.MySqlClient.MySqlCommand
        $cm3.Connection = $cn3
        $cm3.CommandText = $sql3
        $dr3 = $cm3.ExecuteReader()
        while ($dr3.Read())
            {
            $0 = $userstickets
            $1 = $dr3["entities_id"]
            $2 = $dr3["name"]
            $3 = $dr3["date"]
            $4 = $dr3["status"]
         if ($4 -eq 1) {$status = "Nouveau"}
         elseif ($4 -eq 2) {$status = "En cours (Attribué)"}
         elseif ($4 -eq 3) {$status = "En cours (Planifié)"}
         elseif ($4 -eq 4) {$status = "En attente"}
         elseif ($4 -eq 5) {$status = "Résolu"}
         elseif ($4 -eq 6) {$status = "Clos"}
         elseif ($4 -eq 7) {$status = "Acceptée"}
         elseif ($4 -eq 8) {$status = "observe"}
         elseif ($4 -eq 9) {$status = "evaluation"}
         elseif ($4 -eq 10) {$status = "approbation"}
         elseif ($4 -eq 11) {$status = "test"}
         elseif ($4 -eq 12) {$status = "qualification"}
         else {$status = $4}
            Add-Content C:\Users\Administrateur\Desktop\test.txt $0";"$1";"$2";"$3";"$status
    #        $ticketResult = [string]::Format($dr3["entities_id"], $dr3["name"], $dr3["date"])
    #        $ticketResult
            }
        $cn3.Close()
        }
    }    

DATABASE

Voici ce que l'export donne :

259403export.png

++

Last edited by noircc (2016-07-28 14:32:20)

Offline

#5 2016-07-28 14:13:49

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,165

Re: Petite aide pour une Requete SQL

Bonjour,
pouquoi ne mettez vous pas la condition sur le nombre dans HAVING

select *...
from ....
Where statut en cours
GROUP BY demandeur
HAVING count(glpi_tickets.id>1)


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#6 2016-07-28 14:19:57

locehen
Member
From: Bastia/Biguglia
Registered: 2012-07-31
Posts: 134

Re: Petite aide pour une Requete SQL

Bonjour LaDenrée :
LA requete suivante avec ton aide me donne qu'un resultat:
SELECT *  FROM glpi_tickets, glpi_tickets_users WHERE (status != "5" and status != "6") && glpi_tickets_users.tickets_id = glpi_tickets.id && glpi_tickets_users.type = 1  HAVING count(glpi_tickets_users.users_id>1) order by glpi_tickets_users.users_id

Donc HAVING count(glpi_tickets_users.users_id>1) n'est pas la bonne syntaxe je pense...

Offline

#7 2016-07-28 14:21:36

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,165

Re: Petite aide pour une Requete SQL

oups,
c'est la parenthèse qui ne va pas :
HAVING count(glpi_tickets_users.users_id)>1


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#8 2016-07-28 14:51:05

locehen
Member
From: Bastia/Biguglia
Registered: 2012-07-31
Posts: 134

Re: Petite aide pour une Requete SQL

J'ai testé aussi mais nan tongue

Offline

#9 2016-07-28 16:13:59

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,165

Re: Petite aide pour une Requete SQL

il manque aussi le group by !


la requète ci dessous marche aussi pour les anciennes versions : ()

SELECT glpi_users.realname AS DEMANDEUR, count(glpi_tickets.ID) AS nbticket
FROM glpi_tickets
JOIN  glpi_tickets_users  ON glpi_tickets_users.tickets_id = glpi_tickets.id AND  glpi_tickets_users.type = 1
JOIN glpi_users ON glpi_users.id= glpi_tickets_users.users_id
WHERE (status != "5" and status != "6" and status != "solved" and status != "closed")
GROUP BY DEMANDEUR
  HAVING nbticket>1


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#10 2016-07-29 10:45:28

locehen
Member
From: Bastia/Biguglia
Registered: 2012-07-31
Posts: 134

Re: Petite aide pour une Requete SQL

Bonjour LaDenrée :
Le resultat de ta requete me donne ceci :
"nomvide"           138
"Nouveau Client"     7

J'ai reussi a pondre quelque chose grace a noircc mais j'arrive tout de meme pas a fusionner les requetes ensemble pour optimiser le code :
//liste des clients ayants plus d'un ticket ouverts
$req1 = $bdd->query('SELECT distinct(a.name) as "NomUsers" from glpi_users as a, glpi_tickets_users as b where a.id = b.users_id && b.type = 1');
while ($rep1 = $req1->fetch()) {
$users = $rep1['NomUsers'];
           
$req2 = $bdd->query("SELECT COUNT(*) as count FROM glpi_tickets join glpi_tickets_users on glpi_tickets.id = glpi_tickets_users.tickets_id where glpi_tickets_users.users_id = (SELECT ID FROM glpi_users where name = '$users') AND glpi_tickets.status < 5 AND glpi_tickets_users.type = 1");
while ($rep2 = $req2->fetch()) {
if ( $rep2['count'] >1) {
echo '<tr><td>'.utf8_encode($users).'</td><td>'.$rep2['count'].'</td></tr>';
}
}
}

Last edited by locehen (2016-07-29 10:46:31)

Offline

#11 2016-07-29 10:58:01

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,165

Re: Petite aide pour une Requete SQL

bonjour,
c'est probablement que le champ realname est vide.
vos tickets ont bien un demandeur de renseigné ?

essayez ça :

SELECT glpi_users.name AS DEMANDEUR, count(glpi_tickets.ID) AS nbticket
FROM glpi_tickets
JOIN  glpi_tickets_users  ON glpi_tickets_users.tickets_id = glpi_tickets.id AND  glpi_tickets_users.type = 1
JOIN glpi_users ON glpi_users.id= glpi_tickets_users.users_id
WHERE (status != "5" and status != "6" and status != "solved" and status != "closed")
GROUP BY DEMANDEUR
  HAVING nbticket>1


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#12 2016-07-29 11:02:20

locehen
Member
From: Bastia/Biguglia
Registered: 2012-07-31
Posts: 134

Re: Petite aide pour une Requete SQL

LADenrée je n'ai qu'un mot et une réplique : Merci ! et vient t'y boire un chtit coup à l'occasion smile

Offline

#13 2016-07-29 11:17:19

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,165

Re: Petite aide pour une Requete SQL

un p'tit canon sauve un vigneron, malheureusement, la corse est diamétralement opposée à ma destination de vacances 2016


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

Board footer

Powered by FluxBB