【发布时间】:2014-10-24 05:42:12
【问题描述】:
我正在开发一个学术 CMS,我必须在其中显示使用多个连接从 5 个表中提取的查询结果。我没有得到所需的结果。以下是表架构:
类
class_id class_year class_semester class_course class_status
1 2014 6 5 1
2 2014 6 3 1
3 2014 6 1 1
4 2014 6 2 1
5 2014 6 6 1
这里,class_course 是course 表中的一个外键course_id
班级学生
class_student_id class_id student_id class_marks
1 1 s-14-1 5
2 2 s-14-1 2
3 2 s-14-2 0
课程
course_id course_code course_name course_credit
1 MT-001 Calculus I 3
2 MT-002 Calculus II 3
3 CS-001 Computer Programming 4
4 CS-002 Computer Fundamental 4
5 MG-001 Fundamental of Management 3
6 CS-098 Advance Programming 4
course_offer
co_id co_semester course_code
1 1 MT-001
2 1 CS-002
3 1 MG-001
4 1 CS-001
5 2 CS-098
6 2 MT-002
这里,co_semester 表示该课程是为假设 1、2 3 4 等学期的学生开设的。
course_prerequisite
cp_id course_id prereq_id
1 6 3
2 2 1
这里,course_id 和 prereq_id 是 course 表中的外键 course_id
现在,所需的查询输出基于以下条款/条件:
显示所有活动的类 (class_status=1) 和...
- 没有任何先修课程(
class_course与course_prerequisite表比较)并且以前从未学习过(class_student.class_id应该不可用) - 没有必修课但学习失败了,现在又安排学习了
- 有先修课但学生已通过先修课程 (
class_student.class_marks > 50)
这是所需输出的示例
year semester course_code course_name course_credit
2014 6 MG-001 Fundamental of Management 3
2014 6 CS-001 Computer Programming 4
2014 6 MT-001 Calculus I 3
这里MG-001、CS-001和MT-001没有先决条件,之前没有学过,所以必须给学生看。
来自类表
CS-0098 有一个先修课 CS-001 计算机编程,之前没有学过,所以不显示 CS-0098,而是显示 CS-001 计算机编程
类似:
MT-002 具有已学习但未通过的必备类 MT-001。所以,不要显示 MT-002,而是显示 MT-001。
这是我用来生成结果但产生错误结果的查询:
SELECT
cl.class_id,cr.course_id,cr.course_code,cr.course_name,cr.course_credit
FROM class cl
LEFT JOIN course cr
ON cl.class_course=cr.course_id
LEFT JOIN course_offer co
ON co.course_code=cr.course_code
LEFT JOIN class_student cs
ON cl.class_id=cs.class_id
AND cs.student_id='S-14-1'
AND cl.class_status=1
AND co.co_semester<=2
WHERE
cs.class_id IS NULL
这是查询输出:
class_id course_id course_code course_name course_credit
3 1 MT-001 Calculust 1 3
4 2 MT-002 Calculus 2 3
5 6 CS-098 Advance Programming 4
这里,微积分 I 和微积分 II 都显示,对于一个学期的学生来说不应该是这样,因为一个学生一次只能学习一门课。
【问题讨论】:
-
到目前为止你有什么尝试?
-
抱歉忘记输入我使用的查询(产生错误的结果)。问题是用插入的问题编辑的@RossWilson
-
它在哪里/如何显示 MT-001 课程已参加但未通过?
标签: php mysql codeigniter join