IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

liste des employés sans planning


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 106
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Billets dans le blog
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 106
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Billets dans le blog
    1
    Par défaut
    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.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 106
    Par défaut
    j'ai trouvé la solution merci à tout le monde pour votre aide
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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
                ))

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Listes des applications au plan dans TWS
    Par Jean GVE dans le forum z/OS
    Réponses: 5
    Dernier message: 09/12/2014, 11h00
  2. Liste des fichiers sans l'extension .inc.php
    Par Bouki dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 25/07/2011, 18h43
  3. Liste des employés sans planning entre deux dates
    Par Med_be dans le forum Langage SQL
    Réponses: 16
    Dernier message: 13/05/2011, 10h32
  4. [Astuce]Liste des connectés sans lecture du fichier ldb
    Par e040098k dans le forum Contribuez
    Réponses: 3
    Dernier message: 17/07/2007, 22h17
  5. Réponses: 2
    Dernier message: 01/07/2007, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo