2016-08-11 26 views
0

私は以下のテーブルを持っています。私はAndroidのクイズアプリケーションにこれを使用しています。私はクイズを取ることができない学生をフェッチしたい。ここmySQL - 複数のテーブルを結合する

表クイズ

+-------------------------------------------------------------------+ 
| 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 | 
+-------------------------------------------------------------------+ 

表studentclass

+-----------------------------------------------+ 
| 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することです私はまだ同じ結果を得ています。 student_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 

は、問題はあなたがチェックしていないということであると思われる回答

答えて

0

ありがとうござい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 
関連する問題