这可能是一个不可能的MySQL查询吗? 到目前为止,我所拥有的: 员工声明有许多行项目(在行项目表中的外键员工声明id) 作业也有许多行项目(在行项目表中的外键作业id)
(这可能是一个不可能的MySQL查询吗? 到目前为止,我所拥有的: 员工声明有许多行项目(在行项目表中的外键员工声明id) 作业也有许多行项目(在行项目表中的外键作业id),mysql,select,join,Mysql,Select,Join,(line\u items基本上是employee\u语句和作业的联接表) employees\u jobs是employees表和jobs表之间多对多关系的联接表 employee\u语句属于employee(employee\u语句表中的外键employee\u id) 我想做的是: 我有一个使用行项目创建员工报表的场景。这些行项目引用已完成的作业。可以为每个工作分配多个员工 假设我们有一名id为17的员工。我想获得所有尚未与他以前的任何员工报表中的行项目关联的工作 因此,所有这些都将包
line\u items
基本上是employee\u语句
和作业
的联接表)
是employees\u jobs
表和employees
表之间多对多关系的联接表jobs
属于employee\u语句
(employee
表中的外键employee\u语句
)employee\u id
employee\u语句.employee\u id是否为NULL
。这将返回不在任何语句中的作业
我还检查employee\u statements.employee\u id!=17
。这适用于其他员工对账单上的工作
因此,事实上,我得到了他在结果中所做的所有工作,不管他是否有一个工作分配给了自己(因为如果另一个员工分配了,第二个条件就会得到它)。我不知道如何用这个词来回报我想要的工作。(这是漫长的一天。;)我不太明白你想要什么,但你不应该从以下内容开始:
(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号员工相关的工作…对我来说也是漫长的一天,所以我可能遗漏了一些东西,但是这个呢:
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
哎哟我希望我能在不使用三个查询的情况下找出如何做到这一点。但你又让我的脑浆抽搐。。。因此,感谢您尝试一下!您的查询将返回17号员工的所有工作,无论这些工作是否已经在他的某个报表中。@Stephen:事实上,我在发布答案后做了一个小调整。。。你试过当前版本还是我有两个内部联接的原始版本?@Stephen:现在使用NOT EXISTS子句怎么样?我原本认为这不起作用。实际上,我忘了添加最后的条件
和employee\u jobs.employee\u id=17
。更正查询后,这就像一个符咒。非常感谢。我已经取消删除了rla的两个答案,因为我不知道你想要哪一个。@Michael干杯!那太完美了。
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