Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 08/05/2011, 19h18   #1
Nouveau Membre du Club
 
Homme med ben
Étudiant
Inscription : octobre 2010
Messages : 74
Détails du profil
Informations personnelles :
Nom : Homme med ben
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 74
Points : 29
Points : 29
Par défaut liste des employés sans planning

Bonjour,
je cherche à afficher la liste des employés qui n'ont pas de planning entre deux dates supérieurs à la date du jour

employe(id_emp,nom)
planning(id_pla,dateD,dateF)
détail_emp_pla(id_emp,id_pla)

voilà mon essaie avec date début '2011-05-09' et date fin '2011-05-15'
Code sql :
1
2
3
4
5
 
SELECT det.id_emp FROM det_emp_pla det
INNER JOIN planning p ON p.id_pla=det.id_pla
WHERE p.dat_deb >= now() AND 
p.dat_deb NOT BETWEEN '2011-05-09' AND '2011-05-15' AND p.dat_fin NOT BETWEEN '2011-05-09' AND '2011-05-15'
le problème ici c'est que la liste des employé comprend juste les employés présent dans la table détail_emp_pla qui corresponds à mes critères de sélection,alors que je veux aussi ceux qui ne sont pas encore inscrit dans un planning

MERCI
Med_be est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 06h05   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 846
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 846
Points : 1 322
Points : 1 322
salut,

Vu que tu obtiens l'ensemble inverse de celui que tu veux, c'est à dire tous les employé qui ont un planning posé sur la période voulue, il suffit d'utiliser ta requête comme sous requête:

Code sql :
1
2
3
4
5
SELECT nom FROM employe WHERE id NOT IN
(SELECT det.id_emp FROM det_emp_pla det
INNER JOIN planning p ON p.id_pla=det.id_pla
WHERE p.dat_deb >= now() AND 
p.dat_deb NOT BETWEEN '2011-05-09' AND '2011-05-15' AND p.dat_fin NOT BETWEEN '2011-05-09' AND '2011-05-15')

Si tu dois passer au crible des milliers d'entrées dans la sous requête et qu tu vois que ça rame, ça peut venir du fait que parfois mysql recrée la table temporaire qui est générée pour les résultats de la sous requête. La solution est alors simple: tu crées la table temporaire toi même tu la rempli avec les résultats de la sous requête et ta requête principale devient:
Code sql :
SELECT nom FROM employe WHERE id NOT IN (SELECT id FROM temp)
temp est le nom de ta table temporaire.

Pense à mettre des () dans ta clause where quand tu as pas mal d'opérateurs qui s'enchainent, ça évite les déconvenues sur la priorité entre eux et ça améliore la lisibilité pour nous pauvres humains
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/05/2011, 13h12   #3
Nouveau Membre du Club
 
Homme med ben
Étudiant
Inscription : octobre 2010
Messages : 74
Détails du profil
Informations personnelles :
Nom : Homme med ben
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 74
Points : 29
Points : 29
Citation:
Envoyé par ericd69 Voir le message
salut,

Vu que tu obtiens l'ensemble inverse de celui que tu veux, c'est à dire tous les employé qui ont un planning posé sur la période voulue, il suffit d'utiliser ta requête comme sous requête:

Code sql :
1
2
3
4
5
SELECT nom FROM employe WHERE id NOT IN
(SELECT det.id_emp FROM det_emp_pla det
INNER JOIN planning p ON p.id_pla=det.id_pla
WHERE p.dat_deb >= now() AND 
p.dat_deb NOT BETWEEN '2011-05-09' AND '2011-05-15' AND p.dat_fin NOT BETWEEN '2011-05-09' AND '2011-05-15')

Si tu dois passer au crible des milliers d'entrées dans la sous requête et qu tu vois que ça rame, ça peut venir du fait que parfois mysql recrée la table temporaire qui est générée pour les résultats de la sous requête. La solution est alors simple: tu crées la table temporaire toi même tu la rempli avec les résultats de la sous requête et ta requête principale devient:
Code sql :
SELECT nom FROM employe WHERE id NOT IN (SELECT id FROM temp)
temp est le nom de ta table temporaire.

Pense à mettre des () dans ta clause where quand tu as pas mal d'opérateurs qui s'enchainent, ça évite les déconvenues sur la priorité entre eux et ça améliore la lisibilité pour nous pauvres humains
Merci ça marche mais il reste le cas ou il existe une date ou il est inclue mon intervalle c a d :
les employés ayant un planning entre ces deux dates ('2011-05-08' AND '2011-05-16')d1 ne doivent pas figurer libre entre ( '2011-05-09' AND '2011-05-15')d2 par ce que d1 est inclue dans d2
Med_be est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h19   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 846
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 846
Points : 1 322
Points : 1 322
En fait, je te conseille de gérer les problèmes d'intervalles de dates coté php par exemple, c'est pas les fonction qui manquent (même une simple comparaison texte puisque c'est le format de datetime ou date)

ça simplifiera d'autan ta requête et il n'y aura plus que 2 between côté requête.

L'idée c'est de vérifier l'inclusion des 2 intervalles et de modifier les limite de celui autorisé en fonctions de celle de celui exclu et ensuite de garder la date de now() pour chacun des limites de l'intervalle si elles sont inférieures. Tu te retrouves avec 2 cas:
  • une date unique, pas de between dans la sous requête.
  • un intervalle tu as alors tes 2 between.

Sinon tu rajoutes les between nécessaires en les mettant dans une parenthèse ainsi que les précédents dans une autre et tu lies ces dernières par un and.
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 18h07   #5
Nouveau Membre du Club
 
Homme med ben
Étudiant
Inscription : octobre 2010
Messages : 74
Détails du profil
Informations personnelles :
Nom : Homme med ben
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 74
Points : 29
Points : 29
j'ai trouvé la solution merci à tout le monde pour votre aide
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
SELECT id_emp FROM emp WHERE id_emp IN  
(SELECT det.id_emp 
FROM det_emp_pla det INNER JOIN planning p ON p.id_pla=det.id_pla 
AND  p.dat_deb NOT BETWEEN '2011-05-12' AND '2011-05-20' 
AND p.dat_fin NOT BETWEEN '2011-05-12' AND '2011-05-20'
AND '2011-05-12' NOT BETWEEN p.dat_deb AND p.dat_fin 
AND '2011-05-20' NOT BETWEEN p.dat_deb AND p.dat_fin)
union 
(SELECT  emp.id_emp
    FROM    emp
    WHERE  AND NOT EXISTS
            (   SELECT  1
                FROM    det_emp_pla pla
                WHERE   pla.id_emp = emp.id_emp
            ))
Med_be 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 12h55.


 
 
 
 
Partenaires

Hébergement Web