使用多个联接构建复杂的MySQL查询

时间:2019-06-10 12:37:35

标签: mysql database

我有下表:

学科

id             int(11)  AUTO_INCREMENT
name           var_char(50)
speciality     int(11)  -- The ID of the speciality

成绩

id             int(11)  AUTO_INCREMENT
student_id     int(11)  -- the ID of the student from `students` table
discipline_id  int(11)  -- the ID of the discipline from `disciplines` table
grade          int(2)

假设我有两个变量:一个变量持有学生的ID,另一个变量持有专业的ID。
我需要做的是创建一个查询,该查询返回一个包含两列的表:disciplinegradediscipline列应具有将在给定专业中学习的所有学科,而grade列应显示该学生对该学科的评分(来自给定变量)。
规则:
 -该学生在一门学科的成绩可能不止一个(因为成绩表中有多行)
 -学生可能没有一门学科的任何成绩。在这种情况下,结果中的grades列应将NULL显示为结果

示例结果:

discipline   |      grade
-------------|------------
Math         |         2
Math         |         2
Math         |         3
Programming  |         4
DB Basics    |      NULL
and so on... |  
-------------------------

是否可以通过一个查询做到这一点?

编辑: 我试图做这样的事情:

SELECT disciplines.name, grades.grade
FROM disciplines
INNER JOIN grades ON grades.discipline_id = disciplines.id
WHERE disciplines.speciality = 3 AND grades.student_id = 97

这里的问题是,我没有同一专业的其他学科,而该学生还没有任何成绩。

2 个答案:

答案 0 :(得分:0)

select disciplines.name as discipline ,grades.grade 
from grades 
    join disciplines on grades.discipline_id = disciplines.id 
where grade.student_id='123' 
and disciplines.speciality = '234';

不必尝试,所以希望它是正确的:P

答案 1 :(得分:0)

只需使用LEFT JOIN而不是INNER JOIN,以便在尚未评分的学科中显示NULL,并将条件放在那里的学生证上,以便不仅限于具有值的行:

SELECT disciplines.name, grades.grade
FROM disciplines
LEFT JOIN grades ON grades.discipline_id = disciplines.id AND grades.student_id = 97
WHERE disciplines.speciality = 3