Mysql 具有多个条件的SQL选择查询

Mysql 具有多个条件的SQL选择查询,mysql,sql,Mysql,Sql,我被SQL查询卡住了。假设我们有一个雇员、一个任务表以及它们之间的多对多关联。这些表如下所示: 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

我被SQL查询卡住了。假设我们有一个雇员、一个任务表以及它们之间的多对多关联。这些表如下所示:

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
现在我想让所有的员工,他们的任务是“编程”。正确的查询是:

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'
到目前为止还不错。。。但现在我想让所有的员工,他们的任务是“编程”和“支持”。此查询为空:

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'
我收到三条与此查询相关的记录

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')
2个约翰和1个迈克。但那不是我想要的。我想要的是所有有“编程”和“支持”任务的员工,而不是那些只有一项任务的员工

还有另一个选择。我将ALL与子查询一起使用。我们开始:

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')
但是我收到的这个查询为NULL,尽管有一个雇员同时有两个任务:John

如何实现这样的查询

致意
Christian

您需要再次将员工任务加入查询:

SELECT employees.id, employees.name
FROM employees
  INNER JOIN employees_tasks AS et1 ON employees.id = et1.employee_id
  INNER JOIN employees_tasks AS et2 ON employees.id = et2.employee_id
  INNER JOIN tasks AS t1 ON et1.task_id = t1.id AND t1.name = 'Programming'
  INNER JOIN tasks AS t2 ON et2.task_id = t2.id AND t2.name = 'Support'

更新

或者,如果您只筛选感兴趣的任务的结果,则可以按员工分组,只返回具有所需任务计数的人员:

SELECT   employees.id, employees.name
FROM     employees
  INNER JOIN employees_tasks ON employees_tasks.employee_id = employees.id
  INNER JOIN tasks           ON employees_tasks.task_id     = tasks.id
WHERE    tasks.name IN ('Programming', 'Support')
GROUP BY employees.id, employees.name
HAVING   COUNT(DISTINCT tasks.id) = 2

谢谢这适用于两种情况。如果我有任意的条件,我如何处理它?我必须为每个条件加入表格吗?@Christian:请参阅我上面编辑的答案中的替代性、更具可扩展性的方法。我还尝试了“分组方式”和“拥有方式”以及“计数方式”。但我没有让它发挥作用。非常感谢你!