我有以下表格
class_student_mapping
class_id student_id
1 1
1 2
1 3
1 4
2 1
2 2
student_program_mapping
student_id class_id program_id
1 1 1
2 1 1
我需要按班级为学生分配课程
我将获得课程ID和课程ID,而不是我需要在获得该学生后在student_program_mapping中检查最新分配的学生我将从class_student_mapping表中分配新学生,该学生的student_id大于上次分配的学生
为此我在sql下面使用
SELECT MAX( `student_id` ) as last_assigned_student
FROM `student_program_mapping`
WHERE `class_id` =1
AND `program_id` =1
哪个给我结果= 2现在我在class_student_mapping表中找到了大于2的学生ID
SELECT `student_id`
FROM `class_student_mapping`
WHERE `student_id` > (
SELECT MAX( `student_id` ) AS last_assigned_student
FROM `student_program_mapping`
WHERE `class_id` =1
AND `program_id` =1 ) order by student_id limit 1
我给了我学生ID为3,这是我想要的结果
但我有问题,如果我必须为学生计划映射表中没有任何学生程序映射的类ID 2而不是在这种情况下如何获得学生ID。
请帮帮我
与第2课的情况一样。我需要在student_program_mapping表中第一次添加学生,所以我需要最低的学生ID但是这个查询我第一次没有得到它
答案 0 :(得分:1)
您的问题是子查询返回NULL
,因为class_id=2
中的student_program_mapping
没有条目,与NULL
的任何比较都返回false。要解决此问题,请将MAX(student_id)
包装在IFNULL
中,以便在该情况下返回0:
SELECT `student_id`
FROM `class_student_mapping`
WHERE `student_id` > (
SELECT IFNULL(MAX( `student_id` ), 0) AS last_assigned_student
FROM `student_program_mapping`
WHERE `class_id` =2
AND `program_id` =1 ) order by student_id limit 1
输出(SQLFiddle):
student_id
1