mysql - 如何显示所有测验、学生的分数以及他们是否参加了 4 个表格中的测验

标签 mysql sql

我有以下 4 个表:

Teacher: id, teacher

Student: id, student

Quiz: id, teacher_id, answer, dis_1, dis_2, dis_3

Intermediate: id, student_id, teacher_id, score

教师创建测验,学生进行测验。中间表使用相关 ID 跟踪测验的分数。

我想退回所有测验并指出学生的分数或他们没有参加。

如果他们还没有参加测验,那么中级表将没有该学生的条目。如果他们参加了测验,那么中级表将有分数。

到目前为止,这是我的声明:

SELECT Quiz.question as question, 
Quiz.id as id,  Quiz.title as title,
Quiz.teacher_id as teacher_id, Teacher.teacher as teacher, 
Quiz.answer as answer, Quiz.dis_1 as dis1, 
Quiz.dis_2 as dis2, Quiz.dis_3 as dis3,
Intermediate.score as score 
FROM Teacher, Intermediate 
RIGHT JOIN Quiz ON Quiz.id = Intermediate.quiz_id 
RIGHT JOIN Student ON Student.id = Intermediate.student_id 
WHERE Quiz.teacher_id = Teacher.id

当我尝试该陈述时,我得到了所有参加过的测验,并且它显示了刚刚参加过的人的分数。如果分数存在于中间表中,我希望它只显示分数。

最佳答案

你看起来很亲密。可能导致您出现问题的一件事是:

FROM Teacher, Intermediate

当您在不使用显式 INNER/RIGHT/LEFT JOIN 语法的情况下合并表时,通常会导致意外结果,尤其是对于外部连接。您可以阅读更多关于 MySQL JOINS 的信息这可能会在您前进时有所帮助。

您的选择中也没有学生的姓名,我添加了该姓名,以便您看到与分数相关联的人的姓名。如果您的学生没有参加测验,他们的姓名和分数将为 NULL,这是由于 LEFT OUTER JOIN 的工作方式(返回所有行左表,匹配行或右表的 NULL)

SELECT q.question, q.id, q.title, q.teacher_id, t.teacher
   , q.answer, q.dis_1, q.dis_2, q.dis_3, s.student, i.score
FROM Quiz AS q
LEFT OUTER JOIN [Intermediate] AS i ON q.id = i.quiz_id
LEFT OUTER JOIN Teacher AS t ON i.teacher_id = t.teacher_id
LEFT OUTER JOIN Student AS s ON i.student_id = s.student_id

关于mysql - 如何显示所有测验、学生的分数以及他们是否参加了 4 个表格中的测验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8290518/

相关文章:

mysql - 如何从归一化表中获取整体最受欢迎的标签?

sql - SQLite IN 子句上的 COLLATE NOCASE

php - 如何触发 PHP 脚本在存储在数据库中的特定时间发送电子邮件

mysql - 将历史数据存储在单独的事实表中

mysql - sql 从带有日期范围条件的表中选择

mysql - 删除 SQL 表中的额外\in XML 列

mysql - 即使使用 --local-infile=1 也无法将大 CSV 导入 MySQL 5.6

android - VACUUM 结果为 "Unable to open database file"

Android开发-Unknown Host异常问题

mysql在选择中减去