Requête SQL de type SELECT avec plusieurs conditions
Je suis coincé avec une requête SQL. Disons que nous avons un employé, une table de tâches et une association plusieurs-à-plusieurs entre eux. Les tables ressembler à ceci:
employees
id|name
1 | John
2 | Peter
3 | Mike
tasks
id | name
1 | Support
2 | Programming
3 | Call customers
4 | Write Newsletters
5 | Write Invoices
employees_tasks
employee_id | task_id
1 | 1
1 | 2
2 | 3
2 | 4
2 | 5
3 | 2
Maintenant je veux obtenir tous les employés, qui ont "Programmation" de leurs tâches. La bonne question est:
SELECT employees.id, employees.name
FROM employees
INNER JOIN employees_tasks ON employees.id = employees_tasks.employee_id
INNER JOIN tasks ON employees_tasks.task_id = tasks.id
WHERE
tasks.name LIKE 'Programming'
C'est très bien... Mais maintenant je veux obtenir tous les employés, dont les tâches sont de "Programmation" et "Support". Cette requête me donne NULL:
SELECT employees.id, employees.name
FROM employees
INNER JOIN employees_tasks ON employees.id = employees_tasks.employee_id
INNER JOIN tasks ON employees_tasks.task_id = tasks.id
WHERE
tasks.name LIKE 'Programming' AND tasks.name LIKE 'Support'
Je reçois trois enregistrements avec cette requête
SELECT employees.id, employees.name
FROM employees
INNER JOIN employees_tasks ON employees.id = employees_tasks.employee_id
INNER JOIN tasks ON employees_tasks.task_id = tasks.id
WHERE
tasks.name IN ('Programming', 'Support')
2x John et 1x Mike. Mais ce n'est pas ce que je veux. Je veux que tous les employés, qui ont la tâche de "Programmation" ET "Support" - et non pas ceux, qui n'ont qu'une des tâches.
Il y a une autre option. J'utilise TOUT avec une sous-requête. Nous y voilà:
SELECT employees.id, employees.name
FROM employees
INNER JOIN employees_tasks ON employees.id = employees_tasks.employee_id
INNER JOIN tasks ON employees_tasks.task_id = tasks.id
WHERE
tasks.name = ALL
(SELECT DISTINCT name
FROM tasks
WHERE name LIKE 'Programming' OR name LIKE 'Support')
Mais je recevoir à cette requête NULL, bien qu'il y est un employé, qui ont deux tâches: la Jean!
Comment puis-je mettre en œuvre une telle requête?
Cordialement
Christian
OriginalL'auteur Christian | 2012-05-10
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de joindre
employees_tasks
à votre requête une deuxième fois:Mise à JOUR
Alternativement, si vous filtrez vos résultats pour les tâches d'intérêt, vous pouvez
GROUP BY
de l'employé et de retourner uniquement ceux qui ont la tâche désirée count:Voir d'autres, plus approche évolutive dans mon édité réponse ci-dessus.
J'ai testé le "groupe" et "avoir" avec "le comte", trop. Mais je n'ai pas à le faire fonctionner. Merci beaucoup!
OriginalL'auteur eggyal