首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mySQL -连接多个表

问mySQL -连接多个表
EN

Stack Overflow用户
提问于 2016-08-12 02:44:18
回答 1查看 40关注 0票数 0

我有下面显示的表格。我正在使用它作为我的android测验应用程序。我想去接那些不能参加测验的学生。

表格测验

代码语言:javascript
复制
+-------------------------------------------------------------------+
| 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    |
+-------------------------------------------------------------------+

表学生班

代码语言:javascript
复制
+-----------------------------------------------+
| id | class_name | user_faculty | user_student |
+-----------------------------------------------+
| 1  | T4         | faculty_1    | student_1    |
+-----------------------------------------------+
| 2  | T4         | faculty_1    | student_2    |
+-----------------------------------------------+

我在这里的初始查询是:

代码语言:javascript
复制
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-08-02

我能够获取测验表的第一行和第二行

代码语言:javascript
复制
+---------------------------------------+
| id | title  |   start    |    end     |
+---------------------------------------+
| 1  | Quiz 1 | 2016-08-01 | 2016-08-03 |
+---------------------------------------+
| 2  | Quiz 2 | 2016-08-01 | 2016-08-03 |
+---------------------------------------+

现在,我还想获取分数表以及前面的查询。一个叫“student_1”的学生完成了测验。

表分数

代码语言:javascript
复制
+--------------------------------------------------------+
| id | score | grade | user_student | quiz_id | status   |
+--------------------------------------------------------+
| 1  | 10    | 100   | student_1    | 1       | Finished |
+--------------------------------------------------------+

我的新查询

代码语言:javascript
复制
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

结果是

代码语言:javascript
复制
+---------------------------------------------------------------+
| id | title  |   start    |    end     | user_student | status |
+---------------------------------------------------------------+
| 2  | Quiz 2 | 2016-08-01 | 2016-08-03 | NULL         | NULL   |
+---------------------------------------------------------------+

结果很好,但当我在第二个查询中将student_1更改为student_2时,我仍然得到相同的结果。student_2应该会看到两个测验行,因为他还没有参加测验。

代码语言:javascript
复制
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

感谢您的回答

EN

回答 1

Stack Overflow用户

发布于 2016-08-12 05:07:48

问题似乎是,当加入SCORE表时,您没有检查哪个学生参加了测验。因此,如果测验是由任何学生完成的,则测验将从结果中排除。

尝试更改查询,如下所示:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38903975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档