2014-01-22 93 views
2

我一直在使用下面的查询:SQL左内加入(MySQL的)

我使用两个表:(还有其他一些被提及,但没有必要对这个问题)

assessment_criteria 
+-------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+-------------------+--------------+------+-----+---------+----------------+ 
| id    | mediumint(9) | NO | PRI | NULL | auto_increment | 
| scheme_of_work_id | mediumint(9) | NO |  | NULL |    | 
| level    | char(255) | YES |  | NULL |    | 
| criteria   | char(255) | NO |  | NULL |    | 
+-------------------+--------------+------+-----+---------+----------------+ 

criteria_completed 
+------------------------+--------------+------+-----+---------+----------------+ 
| Field     | Type   | Null | Key | Default | Extra   | 
+------------------------+--------------+------+-----+---------+----------------+ 
| id      | mediumint(9) | NO | PRI | NULL | auto_increment | 
| student_ID    | mediumint(9) | NO |  | NULL |    | 
| assessment_criteria_id | mediumint(9) | NO |  | NULL |    | 
| date_marked   | date   | NO |  | NULL |    | 
| notes     | varchar(255) | YES |  | NULL |    | 
| attainment    | varchar(15) | YES |  | NULL |    | 
| effort     | varchar(15) | YES |  | NULL |    | 
| marked_by    | varchar(20) | NO |  | NULL |    | 
+------------------------+--------------+------+-----+---------+----------------+ 

我使用这样的查询显示的考核标准列表,学生还没有完成:

SELECT DISTINCT assessment_criteria.id, assessment_criteria.level, assessment_criteria.criteria FROM assessment_criteria, criteria_completed 
WHERE (assessment_criteria.scheme_of_work_id = '17') 
AND (assessment_criteria.id NOT IN (SELECT criteria_completed.assessment_criteria_id FROM criteria_completed WHERE (student_ID = '403'))) 
ORDER BY level; 

该查询已经成为令人难以置信的慢跑,我一直在努力,使其更快使用LEFT JOIN。

SELECT DISTINCT a.id, a.level, a.criteria 
FROM assessment_criteria a 
LEFT JOIN criteria_completed b 
ON a.id = b.assessment_criteria_id 
WHERE b.assessment_criteria_id IS NULL 

但我没有成功,当我尝试添加项目和学生的子句;即。

SELECT DISTINCT a.id, a.level, a.criteria 
FROM assessment_criteria a 
LEFT JOIN criteria_completed b 
ON a.id = b.assessment_criteria_id 
WHERE b.assessment_criteria_id IS NULL 
AND (b.student_ID = '403') 
AND (a.scheme_of_work_id = '17'); 

mysql报告“空集”。我怀疑我是不正确地引用这些外键?

回答

1

(只是为了确认,你正在使用b.assessment_criteria_id IS NULL检测失败联接)

上表b应用滤波器到WHERE条款会过滤掉其中加入任何记录失败,我相信这是原因问题。

你可以尝试b过滤器移动到JOIN条件:

SELECT DISTINCT a.id, a.level, a.criteria 
FROM assessment_criteria a 
LEFT JOIN criteria_completed b 
    ON a.id = b.assessment_criteria_id 
    AND (b.student_ID = 403) 
WHERE b.assessment_criteria_id IS NULL 
    AND (a.scheme_of_work_id = 17); 

虽然就个人而言,我不喜欢filtering like this in a JOIN。替代方案是:

SELECT DISTINCT a.id, a.level, a.criteria 
FROM assessment_criteria a 
LEFT JOIN criteria_completed b 
    ON a.id = b.assessment_criteria_id 
WHERE (a.scheme_of_work_id = 17) 
    AND (b.assessment_criteria_id IS NULL OR b.student_ID = 403); 
+0

谢谢。这似乎列出了所有来自assessment_criteria的记录,不仅仅限于这些用于scheme_of_work_ID = 17的记录。 –

+0

我已更新 - a.filter仍然需要在哪里。 – StuartLC

+0

您编辑的版本可以正常使用!谢谢! –