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
(外键line_items
。)。 jobs
也有很多line_items
(job_id
表中的外键line_items
。(line_items
基本上是employee_statements
和jobs
的连接表)
employees_jobs
是employees
表和jobs
表之间多对多关系的连接表。employee_statements
属于employees
(employee_id
表中的外键employee_statements
)我有一个使用订单项创建员工对帐单的方案。这些订单项引用已完成的作业。可以为每个工作分配多名员工。
假设我们有一名id = 17
的员工。我希望在之前的任何员工陈述中获得与订单项无关的所有工作。
因此,所有这些都将包含在结果中:
因此,如果员工17和员工14都在同一个工作上工作,并且员工14的一个陈述中有一个已经有该职位的行项目(但员工17的陈述没有该行项目),则该工作应该显示在我的查询结果。
上述查询将返回员工17处理的所有作业,无论这些作业是否已分配给任何人的行项目。
我理解为什么。
在条件逻辑中,我检查是否employee_statements.employee_id IS NULL
。这将返回不在任何语句上的作业。
我也检查了employee_statements.employee_id != 17
。这适用于其他员工陈述中的工作。
所以,实际上我得到了他在结果中所做的所有工作,无论他是否已经分配给自己(因为如果另一名员工分配了它,第二个条件就是抓住它)。我无法弄清楚如何用这个来回报我想要的工作。 (这是漫长的一天。;))
答案 0 :(得分:3)
对我来说也是漫长的一天,所以我可能会遗漏一些东西,但是这个怎么样:
SELECT jobs.id
FROM jobs
INNER JOIN employees_jobs
ON employees_jobs.job_id = jobs.id
WHERE NOT EXISTS (SELECT 'X' FROM line_items
INNER JOIN employee_statements
ON line_items.employee_statement_id = employee_statements.id
AND employee_statements.employee_id = 17
WHERE line_items.job_id = employees_jobs.job_id)
AND employee_jobs.employee_id = 17
GROUP BY jobs.id
ORDER BY jobs.delivery_date ASC
答案 1 :(得分:2)
我不太了解你想要的东西,但是你不应该从以下的东西开始:
(employee_statements.employee_id = 17 AND
/* SOME QUERY HERE TO DETERMINE IF NOT ASSOCIATED */)
OR
(employee_statements.employee_id = 17 AND
/* SOME QUERY HERE TO DETERMINE IF ASSOCIATED WITH OTHER EMPLOYEE STATEMENT */ )
很难说出究竟发生了什么,这里也是漫长的一天,但你现在可能会得到这个:)
看起来你需要第二个查询,因为这只是首先返回与员工17相关的工作......