【发布时间】:2011-05-12 21:26:48
【问题描述】:
到目前为止我所拥有的:
SELECT jobs.id
FROM jobs
LEFT JOIN employees_jobs
ON employees_jobs.job_id = jobs.id
LEFT JOIN line_items
ON line_items.job_id = employees_jobs.job_id
LEFT JOIN employee_statements
ON line_items.employee_statement_id = employee_statements.id
WHERE (
employee_statements.employee_id != 17 OR
employee_statements.employee_id IS NULL
)
AND employees_jobs.employee_id = 17
GROUP BY jobs.id
ORDER BY jobs.delivery_date ASC
-
employee_statements有很多line_items(line_items表中的外键employee_statements_id。)。 -
jobs也有很多line_items(line_items表中的外键job_id)。
(line_items 基本上是employee_statements 和jobs 的连接表)
-
employees_jobs是employees表和jobs表之间的多对多关系的连接表。 -
employee_statements属于employees(employee_statements表中的外键employee_id)
我想要做什么:
我有一个使用行项目创建员工报表的场景。这些行项目引用已完成的作业。每个工作可以分配多个员工。
假设我们有一个id = 17 的员工。我想获取尚未与他以前的任何员工报表中的行项目相关联的所有工作。
因此,所有这些都将包含在结果中:
- 员工 17 从事的所有与行项目无关的工作。
- 员工 17 从事的所有工作都与其他员工报表上的行项目相关联。
因此,如果员工 17 和员工 14 都从事同一项工作,并且员工 14 的其中一个报表已经有该工作的行项目(但员工 17 的报表没有该行项目),则该工作应该显示在我的查询结果。
我被难住的地方:
上述查询返回员工 17 从事的所有工作,无论它们是否已分配到任何人的行项目。
我明白为什么。
在条件逻辑中,我检查employee_statements.employee_id IS NULL。这将返回不在任何语句中的作业。
我还检查了employee_statements.employee_id != 17。这是针对其他员工声明中的工作。
因此,实际上我在结果中得到了他从事的所有工作,无论他是否为自己分配了一个(因为如果另一个员工分配了它,则第二个条件会抓住它)。我不知道如何用这个词来返回我想要的工作。 (这是漫长的一天。;))
【问题讨论】:
-
我已取消删除 rla 的两个答案,因为我不知道您想要哪一个。
-
@迈克尔干杯!那太完美了。