Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这可能是一个不可能的MySQL查询吗? 到目前为止,我所拥有的: 员工声明有许多行项目(在行项目表中的外键员工声明id) 作业也有许多行项目(在行项目表中的外键作业id)_Mysql_Select_Join - Fatal编程技术网

这可能是一个不可能的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
我想做的是: 我有一个使用行项目创建员工报表的场景。这些行项目引用已完成的作业。可以为每个工作分配多个员工

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

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

  • 员工17处理的所有与行项目无关的作业
  • 员工17从事的与其他员工对账单上的行项目关联的所有工作
  • 因此,如果17号员工和14号员工都从事同一工作,并且14号员工的其中一个报表已经有了该工作的行项目(但17号员工的报表没有该行项目),那么该工作应该显示在我的查询结果中

    我被难倒的地方是: 上面的查询返回员工17所处理的所有作业,无论这些作业是否已分配给任何人的行项目

    我明白原因。

    在条件逻辑中,我检查
    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