MySQL多表关联查询结果不符预期,请求修正SQL语句
修正SQL查询以返回预期结果
先明确你的数据库表结构:
student表
studentid (PK) | studentname 1 | A
class表
classid (PK) | classname 1 | Math 2 | Science
teach表
teachid (PK) | classid | studentid 1 | 1 | 1 2 | 2 | 1
quiz表
quizid (PK) | classid | quizname 1 | 1 | mathquiz 2 | 2 | science quiz
quizscore表
quizscoreid(PK) | quizid | studentid | score 1 | 1 | 1 | 60 2 | 2 | 1 | 0
你的原查询返回了多余的记录,问题主要出在两个核心点:
- 关联
quiz表时直接硬编码classid='1',虽然后续WHERE条件做了限制,但关联逻辑不够严谨; - 关联
quizscore表时只匹配了studentid,没有同时匹配quizid,导致学生A的所有测验分数都被错误关联进来,和当前测验形成了无效组合。
下面是修正后的查询语句:
SELECT student.studentid, quiz.quizid, teach.classid, student.studentname, class.classname, quiz.quizname, quizscore.score FROM teach INNER JOIN class ON teach.classid = class.classid INNER JOIN student ON teach.studentid = student.studentid INNER JOIN quiz ON quiz.classid = teach.classid LEFT JOIN quizscore ON quizscore.studentid = student.studentid AND quizscore.quizid = quiz.quizid WHERE teach.classid = '1' AND quiz.quizid = '1' ORDER BY student.studentid ASC;
关键修正说明:
- 把
quiz表的关联条件从quiz.classid = '1'改为quiz.classid = teach.classid,让quiz和学生所在的班级正确关联,避免硬编码带来的扩展性问题; - 扩展
quizscore的关联条件,同时匹配studentid和quizid,确保只拉取当前学生对应目标测验的分数,不会把其他测验的分数错误关联; - 调整了SELECT字段的顺序,和你预期的输出格式保持一致;
- 简化了WHERE条件,去掉了冗余的
teach.classid = quiz.classid(已经在JOIN条件中保证)。
执行这个查询后,就能得到你预期的结果:
studentid | quizid | classid | studentname | classname | quizname | score 1 | 1 | 1 | A | Math | mathquiz | 60
内容的提问来源于stack exchange,提问作者Billy Anthony
相关产品推荐
相关产品推荐

