涉及NOT IN的棘手的MYSQL查询

时间:2013-08-12 14:06:51

标签: php mysql join

为了获得结果,我有两张桌子加在一起。 一个表包含具有唯一ID(评估)的评估列表,而另一个表(staff_to_assessments)包含分配给工作人员的评估列表。此表的示例记录将包含Staff成员唯一ID和分配唯一ID。这表明用户已链接到作业。

我编写了一个功能,它只从评估表中获取评估表,而这些评估表尚未分配给staff_to_assessment表中的工作人员。这是为了填充前端的下拉框,如果需要,可以将这些剩余的评估分配给工作人员,因此我不想显示已经分配的任何评估。

我的SQL查询如下:

    SELECT * FROM assessments a 
    LEFT JOIN staff_to_assessment s2a ON a.assessment_id = s2a.assessment_id                            
    WHERE a.assessment_id NOT IN
         (SELECT assessment_id FROM staff_to_assessment WHERE staff_id = '" . (int)$options['staffId'] . "')";

这似乎没有产生我需要的响应。谁能看到我哪里出错了? 谢谢!

2 个答案:

答案 0 :(得分:1)

我认为您的查询工作太难了。您只需找到与left outer join无匹配的行:

SELECT a.*
FROM assessments a LEFT JOIN
     staff_to_assessment s2a
     ON a.assessment_id = s2a.assessment_id                            
WHERE s2a.assessment_id is null;

您无需同时使用left joinnot in条款。

答案 1 :(得分:0)

NOT IN [subquery]之类的查询可以(并且应该)始终重写为LEFT JOIN

SELECT a.*
FROM assessments a 
LEFT JOIN staff_to_assessment s2a USING (assessment_id) -- equivalent to "ON a.assessment_id = s2a.assessment_id", as both columns have the same name
WHERE staff_id IS NULL

这相当于:

SELECT a.*
FROM assessments a 
WHERE a.assessment_id NOT IN (SELECT assessment_id FROM staff_to_assessment)

两者通常都被优化为相同的执行计划,但前者更可取,因为它往往会产生更快的查询。