这可能是一个不可能的MySQL查询吗?

时间:2010-11-19 21:42:48

标签: mysql select join

到目前为止我所拥有的:

   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_statementsline_items表中有许多employee_statements_id(外键line_items。)。
  • jobs也有很多line_itemsjob_id表中的外键line_items

line_items基本上是employee_statementsjobs的连接表)

  • employees_jobsemployees表和jobs表之间多对多关系的连接表。
  • employee_statements属于employeesemployee_id表中的外键employee_statements

我正在尝试做什么:

我有一个使用订单项创建员工对帐单的方案。这些订单项引用已完成的作业。可以为每个工作分配多名员工。

假设我们有一名id = 17的员工。我希望在之前的任何员工陈述中获得与订单项无关的所有工作。

因此,所有这些都将包含在结果中:

  1. 员工17所处理的所有工作都与订单项无关。
  2. 员工17所处理的所有工作都与不同员工声明中的订单项相关联。
  3. 因此,如果员工17和员工14都在同一个工作上工作,并且员工14的一个陈述中有一个已经有该职位的行项目(但员工17的陈述没有该行项目),则该工作应该显示在我的查询结果。

    我难倒的地方:

    上述查询将返回员工17处理的所有作业,无论这些作业是否已分配给任何人的行项目。

    我理解为什么。

    在条件逻辑中,我检查是否employee_statements.employee_id IS NULL。这将返回不在任何语句上的作业。

    我也检查了employee_statements.employee_id != 17。这适用于其他员工陈述中的工作。

    所以,实际上我得到了他在结果中所做的所有工作,无论他是否已经分配给自己(因为如果另一名员工分配了它,第二个条件就是抓住它)。我无法弄清楚如何用这个来回报我想要的工作。 (这是漫长的一天。;))

2 个答案:

答案 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相关的工作......