Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2010, 11h55   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 30
Points : 10
Points : 10
Par défaut Requête avec having

Bonjour à tous,

dans le cadre d'un développement d'une base de saisi de ticket hotline, j'ai développer un site web permettant d'attribuer automatiquement un ticket au personnes les plus compétente, les plus disponible et ayant le moins d'expérience.

Voici la requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
SELECT 
	utilisateurs.id AS id, 
	domaine_competences.niveau AS niveau,
	domaine_competences.experience AS exp, 
	count(*) AS nbr 
FROM utilisateurs 
	LEFT OUTER JOIN domaine_competences ON utilisateurs.id=domaine_competences.utilisateur 
	LEFT OUTER JOIN tickets ON tickets.utilisateur=utilisateurs.id 
WHERE domaine_competences.competence=".$this->type_comp." 
	AND utilisateurs.hotline>1 
	AND absence = 1
	AND tickets.etat < 3
GROUP BY utilisateurs.id
HAVING count( * ) < ".$this->par->param->get_limit()."
ORDER BY 
	niveau DESC, 
	nbr ASC,
	exp DESC
Explication :
Competence ( $this->type_comp) = "La compétence demandé pour résoudre le problème" par exemple : hardware, imprimante, logiciels ...
tickets.etat : un ticket peut avoir plusieur état : 1 - en saisie , 2 - en cours de traitement, 3 - cloturé , 4 - voie de garage , 5 - projet
$this->par->param->get_limit() : renvoi la limite max des ticket d'une personne en file d'attente (ici on peut mettre 10 ).

DONC : Cette requête me donne la liste des utilisateurs n'étant pas absent, ayant les compétence nécessaire pour résoudre le problème ( trie du niveau ), étant le plus disponible ( nbr décroissant de tickets ) et étant demandeur expérience en cette compétence (exp descendant )

MAIS : lorsqu'un utilisateur possède 0 tickets en état inférieur à 3, il est donc disponible et même si il a les compétences, étant présent, ayant le niveau de hotline suffisant et étant demandeur d'expérience, il n'apparait pas dans la liste a cause du HAVING count(*) qui est null

Comment faire pour résoudre mon problème ?

J'avoue être dans une impasse
henoch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 13h05   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Quand tu fais une jointure externe et que tu as une condition de restriction sur les données de la table de droite pour une jointure LEFT JOIN ou de gauche pour une jointure RIGHT JOIN, il faut déplacer cette restriction du WHERE vers la condition de jointure ON :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
    utilisateurs.id AS id, 
    domaine_competences.niveau AS niveau,
    domaine_competences.experience AS exp, 
    count(*) AS nbr 
FROM utilisateurs 
    LEFT OUTER JOIN domaine_competences ON utilisateurs.id = domaine_competences.utilisateur 
    LEFT OUTER JOIN tickets 
        ON tickets.utilisateur=utilisateurs.id 
        AND tickets.etat < 3
WHERE domaine_competences.competence=".$this->type_comp." 
    AND utilisateurs.hotline>1 
    AND absence = 1
 
GROUP BY utilisateurs.id, domaine_competences.niveau, domaine_competences.experience,
HAVING count( * ) < ".$this->par->param->get_limit()."
ORDER BY 
    niveau DESC, 
    nbr ASC,
    exp DESC
Tu n'indiques pas de quelle table provient la colonne absence, je l'ai donc laissée dans le WHERE.

Attention ! Tu n'as pas mis dans le GROUP BY toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de groupage ! Les résultats donnés pour les colonnes domaine_competences.niveau et domaine_competences.experience sont donc aléatoires ! Je les ai ajoutés.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 13h50   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 30
Points : 10
Points : 10
Ok merci, je test cela de suite
henoch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 13h55   #4
Candidat au titre de Membre du Club
 
Inscription : octobre 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 30
Points : 10
Points : 10
Ok ca marche nikel,
je te remercie beaucoup.

PS : oui absence est bien lié a une table mais pas utilisé ici
henoch est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h31.


 
 
 
 
Partenaires

Hébergement Web