代码之家  ›  专栏  ›  技术社区  ›  Stephen

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

  •  4
  • Stephen  · 技术社区  · 14 年前

    到目前为止我有:

       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 . 我希望得到所有尚未与他以前的任何员工声明中的行项目关联的工作。

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

    1. 员工17从事的所有与行项目无关的工作。
    2. 员工17从事的所有与其他员工声明中的行项目关联的工作。

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

    我被难住了:

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

    我明白为什么。

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

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

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   ryanlahue    14 年前

    对我来说也是漫长的一天,所以我可能会错过一些东西,但这又如何呢:

    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
    
        2
  •  2
  •   J V    14 年前

    我不太明白你想要什么,但你不应该从以下几点开始:

    (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关联的作业…