到目前为止我有:
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
(外键
employee_statements_id
在
行项目
表)。
-
jobs
有很多
行项目
以及(外键
job_id
在
行项目
表)。
(
行项目
基本上是的联接表
员工声明
和
工作
)
-
employees_jobs
是多对多关系的联接表
employees
桌子和
工作
表。
-
员工声明
属于
员工
(外键
employee_id
在
员工声明
表)
我想做的是:
我有一个场景,其中使用行项目创建员工对账单。这些行项目引用已完成的作业。可以为每个工作分配多个员工。
假设我们有一个员工
id = 17
. 我希望得到所有尚未与他以前的任何员工声明中的行项目关联的工作。
因此,所有这些都将包含在结果中:
-
员工17从事的所有与行项目无关的工作。
-
员工17从事的所有与其他员工声明中的行项目关联的工作。
因此,如果员工17和员工14都在同一个工作中工作,并且员工14的一个对账单已经具有该工作的行项目(但员工17的对账单没有该行项目),则该工作应显示在我的查询结果中。
我被难住了:
上面的查询返回员工17处理的所有作业,不管这些作业是否已分配给任何人的行项目。
我明白为什么。
在条件逻辑中,我检查
employee_statements.employee_id IS NULL
. 这将返回不在任何语句上的作业。
我也检查一下
employee_statements.employee_id != 17
. 这是针对其他员工声明中的工作。
所以,实际上,我得到了他在结果中所做的所有工作,不管他是否有一个分配给自己(因为如果另一个员工分配了它,第二个条件就会抓住它)。我不知道如何用这个词来回报我想要的工作。(这是漫长的一天。;)