2014-01-22 96 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

您編輯的版本可以正常使用!謝謝! –