1

我有两个表,我将它们连接在一起以获得结果。一个表包含具有唯一 ID 的评估列表(评估),而另一个表 (staff_to_assessments) 包含分配给工作人员的评估列表。此表的示例记录将包含员工唯一 ID 和分配唯一 ID。这表明用户已链接到分配。

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

MySQL查询如下:

    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'] . "')";

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

4

2 回答 2

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;

您不需要同时使用 aleft join和 anot in子句。

于 2013-08-12T14:13:51.403 回答
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)

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

于 2013-08-12T14:14:15.513 回答