2012-05-10 79 views
4

我遇到了SQL查询。假设我们有一个员工,一个任务表和他们之间的多对多关联。这些表看起来像这样:具有多个条件的SQL SELECT查询

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' 

到目前为止好......但我现在想获得的所有员工,他们的任务是“编程” “支持”。该查询给了我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' 

我收到三个记录与此查询

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约翰和1x麦克。但那不是我想要的。我希望拥有“编程”和“支持”任务的所有员工 - 而不是那些只有其中一项任务的员工。

还有另一种选择。我将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,虽然有一个员工,谁拥有这两个任务:约翰!

我该如何实现这样的查询?

问候 基督教

回答

7

你需要加入employees_tasks到您的查询第二次:

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' 

UPDATE

另外,如果您筛选结果只感兴趣的任务,你可以GROUP BY员工,只返回thos e谁有理想的任务计数:

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 
+0

谢谢。这适用于两种情况。如果我有任意条件,我该如何处理它?我必须参加每个条件的表吗? – Christian

+0

@Christian:在我上面编辑的答案中看到另一种更具扩展性的方法。 – eggyal

+0

我也用“count”来试验“g​​roup by”和“having”。但我没有得到它的工作。非常感谢你! – Christian