为了获得结果,我有两张桌子加在一起。 一个表包含具有唯一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'] . "')";
这似乎没有产生我需要的响应。谁能看到我哪里出错了? 谢谢!
答案 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 join
和not 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)
两者通常都被优化为相同的执行计划,但前者更可取,因为它往往会产生更快的查询。