web-dev-qa-db-fra.com

Requête MYSQL pour rechercher des enregistrements entre deux plages de dates

Je travaille dans une application web utilisant PHP et MySQL.

J'ai deux tables

  1. Employé

    employee_id     email_id
    3             [email protected]
    4             [email protected]
    5             [email protected]
    6             [email protected]
    7             [email protected]
    
  2. Encadrement

    coaching_id     emp_id  start_date  end_date
     1               4      2014-05-01  2014-10-02
     2               5      2014-12-18  2015-01-22
    

Je veux une requête pour découvrir les employés qui ne sont pas inscrits à un programme de coaching entre une plage de dates spécifiée comme Date de début "2015-01-22" et Date de fin "2015-03-12".

Maintenant, j'utilise une requête comme celle-ci,

SELECT employee_id 
FROM employee 
WHERE sup_id = 3 
AND employee_id NOT IN 
(
    SELECT emp_id 
    FROM (coaching) 
    WHERE (start_date NOT BETWEEN "2014-12-26" AND "2015-01-30") 
    AND (end_date NOT BETWEEN "2014-12-26" AND "2015-01-30")

)

J'ai une logique, "Si un employé a déjà rejoint un programme de coaching à start_date et end_date donnés, il n'est éligible à aucun programme de coaching.

Par exemple: Si la date de début est '2014-12-26' et la date de fin est '2015-01-30'.
Ensuite, l'employé avec l'ID 5 n'est pas éligible pour ce programme de coaching car il est maintenant sur une autre activité de coaching dont la date de début est '2014-12-18' et la date de fin est '2015-01-22'.
Mais l'employé avec l'ID 4 est éligible ainsi que tous les autres employés qui ne participent à aucune activité de coaching

Où est le problème dans ma requête

Merci

2
Bikram Pahi

Votre requête a un défaut logique: elle essaie de trouver des personnes qui NE SONT PAS dans la liste des personnes qui ont du coaching mais uniquement si le coaching n'est PAS dans la fenêtre cible.

Au lieu de cela, joignez la table employee et coaching sur employee_id, en utilisant toutes les lignes dans employee mais uniquement en utilisant les lignes dans coaching où la date_arrêt est postérieure ou égale à la date de début souhaitée (le coaching se termine après le démarrage de la fenêtre) et la date_début est inférieure à ou égal à la date d'arrêt souhaitée (le coaching commence avant la fin de la fenêtre). Excluez ensuite les employés avec une ou plusieurs lignes correspondantes dans le coaching.

SELECT e.id AS employee_id
  FROM employee e
  LEFT JOIN coaching c ON c.employee_id = e.id
                      AND c.end_date >= '2014-12-26'
                      AND c.start_date <= '2015-01-30'
 WHERE c.employee_id IS NULL;

Démo en direct: http://sqlfiddle.com/#!9/79b39/4

5
Michael - sqlbot