【问题标题】:Is this possibly an impossible MySQL query?这可能是一个不可能的 MySQL 查询吗?
【发布时间】: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_itemsline_items 表中的外键 employee_statements_id。)。
  • jobs 也有很多 line_itemsline_items 表中的外键 job_id)。

line_items 基本上是employee_statementsjobs 的连接表)

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

我想要做什么:

我有一个使用行项目创建员工报表的场景。这些行项目引用已完成的作业。每个工作可以分配多个员工。

假设我们有一个id = 17 的员工。我想获取尚未与他以前的任何员工报表中的行项目相关联的所有工作。

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

  1. 员工 17 从事的所有与行项目无关的工作。
  2. 员工 17 从事的所有工作都与其他员工报表上的行项目相关联。

因此,如果员工 17 和员工 14 都从事同一项工作,并且员工 14 的其中一个报表已经有该工作的行项目(但员工 17 的报表没有该行项目),则该工作应该显示在我的查询结果。

我被难住的地方:

上述查询返回员工 17 从事的所有工作,无论它们是否已分配到任何人的行项目。

我明白为什么。

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

我还检查了employee_statements.employee_id != 17。这是针对其他员工声明中的工作。

因此,实际上我在结果中得到了他从事的所有工作,无论他是否为自己分配了一个(因为如果另一个员工分配了它,则第二个条件会抓住它)。我不知道如何用这个词来返回我想要的工作。 (这是漫长的一天。;))

【问题讨论】:

  • 我已取消删除 rla 的两个答案,因为我不知道您想要哪一个。
  • @迈克尔干杯!那太完美了。

标签: mysql select join


【解决方案1】:

对我来说也是漫长的一天,所以我可能会遗漏一些东西,但是这个怎么样:

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 子句怎么样?
  • 我原本以为这样不行。实际上,我忘记添加最终条件AND employee_jobs.employee_id = 17。更正查询后,这就像一个魅力。谢谢!
【解决方案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 相关的工作......

【讨论】:

  • 哎哟。我希望我可以在不使用三个查询的情况下弄清楚如何做到这一点。但是你又让我的脑汁抽了……所以+1
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2019-11-05
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多