簡體   English   中英

MySQL-連接多個表

[英]mySQL - joining multiple tables

我有下表所示。 我正在將其用於我的android測驗應用程序。 我想拿那些不能參加測驗的學生。

表測驗

+-------------------------------------------------------------------+
| id | title  |   start    |    end     | class_name | user_faculty |
+-------------------------------------------------------------------+
| 1  | Quiz 1 | 2016-08-01 | 2016-08-03 | T4         | faculty_1    |
+-------------------------------------------------------------------+
| 2  | Quiz 2 | 2016-08-01 | 2016-08-03 | T4         | faculty_1    |
+-------------------------------------------------------------------+
| 3  | Quiz 3 | 2016-08-03 | 2016-08-04 | T4         | faculty_1    |
+-------------------------------------------------------------------+

表學生班

+-----------------------------------------------+
| id | class_name | user_faculty | user_student |
+-----------------------------------------------+
| 1  | T4         | faculty_1    | student_1    |
+-----------------------------------------------+
| 2  | T4         | faculty_1    | student_2    |
+-----------------------------------------------+

我最初的查詢是:

SELECT Q.id, Q.title, Q.start, Q.end
FROM quiz Q
INNER JOIN studentclass SC
ON Q.class_name = SC.class_name
AND Q.start_on <= now() 
AND Q.end_on >= now()
AND SC.user_student = 'student_1'

考慮今天是2016年8月2日

我能夠獲取測驗表的第一行和第二行

+---------------------------------------+
| id | title  |   start    |    end     |
+---------------------------------------+
| 1  | Quiz 1 | 2016-08-01 | 2016-08-03 |
+---------------------------------------+
| 2  | Quiz 2 | 2016-08-01 | 2016-08-03 |
+---------------------------------------+

現在,我也想與之前的查詢一起獲取分數表。 學生“ student_1”完成了測驗。

表分數

+--------------------------------------------------------+
| id | score | grade | user_student | quiz_id | status   |
+--------------------------------------------------------+
| 1  | 10    | 100   | student_1    | 1       | Finished |
+--------------------------------------------------------+

我的新查詢

SELECT Q.id, Q.title, Q.start, Q.end, S.user_student, S.status
FROM quiz Q
INNER JOIN studentclass SC
ON Q.class_name = SC.class_name
AND Q.start_on <= now() 
AND Q.end_on >= now()
AND SC.user_student = 'student_1'
LEFT JOIN score S
ON Q.id = S.quiz_id
WHERE S.quiz_id IS NULL

結果是

+---------------------------------------------------------------+
| id | title  |   start    |    end     | user_student | status |
+---------------------------------------------------------------+
| 2  | Quiz 2 | 2016-08-01 | 2016-08-03 | NULL         | NULL   |
+---------------------------------------------------------------+

結果很好,但是當我在第二個查詢中將student_1更改為Student_2時,我仍然得到相同的結果。 學生_2應該看到兩個測驗行,因為他還沒有參加測驗。

SELECT Q.id, Q.title, Q.start, Q.end, S.user_student, S.status
FROM quiz Q
INNER JOIN studentclass SC
ON Q.class_name = SC.class_name
AND Q.start_on <= now() 
AND Q.end_on >= now()
AND SC.user_student = 'student_2' //this is where I changed the student_1 to student_2
LEFT JOIN score S
ON Q.id = S.quiz_id
WHERE S.quiz_id IS NULL

謝謝您的回答

似乎問題是您在加入SCORE表時沒有檢查哪個學生參加了測驗。 因此,如果有任何學生完成測驗,則測驗將從結果中排除。

嘗試像這樣更改查詢:

SELECT Q.id, Q.title, Q.start, Q.end, S.user_student, S.status
FROM quiz Q
INNER JOIN studentclass SC
ON Q.class_name = SC.class_name
AND Q.start_on <= now() 
AND Q.end_on >= now()
LEFT JOIN score S
ON Q.id = S.quiz_id
AND SC.user_student = S.user_student   -- Do not consider other students 
WHERE S.quiz_id IS NULL
AND SC.user_student = 'student_2'      -- moved from join clause for clarity

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM