Je travaille dans une application web utilisant PHP et MySQL.
J'ai deux tables
Employé
employee_id email_id
3 [email protected]
4 [email protected]
5 [email protected]
6 [email protected]
7 [email protected]
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
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