繁体   English   中英

sql语句复杂条件“ join”

[英]sql statement complex condition “join”

我有这3张桌子

1. course 
------------------------ 
CourseID     CourseName             
  1            English 1
  2            English 2
  3            Math 1
  4            Math 2
2. courseRequirements
------------------------
CourseID  ReqID                
   2        1
   4        3
3. studentcoursecomplete
-----------------------
CourseID   StudentID    
   1           5

我需要一个选择语句执行以下操作

  1. 显示表格课程中的课程名称
  2. 不要显示学生完成“ studentcoursecomplete”的课程
  3. 不显示要求学生未完成的课程
  4. 显示有要求学生完成的课程

在此示例中,结果将是

CourseID      CourseName             
  2            English 2
  3            Math 1

因为学生完成英语1,所以他看不到
而且他没有完成数学1 ..所以他看不到数学2

我的选择语句做(1,2)
我该怎么办(3,4)
3-不显示要求学生未完成的课程
4-显示有学生要求完成的课程

SELECT course.*
FROM course
LEFT JOIN studentcoursecomplete ON studentcoursecomplete.CourseID = course.CourseID
LEFT JOIN courseRequirements ON courseRequirements.CourseID = course.CourseID
WHERE studentcoursecomplete.CourseID IS NULL 

做到这一点的一种方法是,获取用户不在的内容,以及用户无法获取的内容,并从总结果集中过滤掉这些内容。

SELECT c.* 
FROM course c
LEFT JOIN studentcoursecomplete scc ON scc.CourseID = c.CourseID
WHERE scc.studentid = 1 
  AND scc.CourseID IS NULL
  AND c.courseid NOT IN
(   SELECT cr.courseid 
    FROM courseRequirements cr
    WHERE cr.reqid IN
    (   SELECT c.courseid 
        FROM course c
        LEFT JOIN studentcoursecomplete scc ON scc.CourseID = c.CourseID 
        LEFT JOIN courseRequirements cr ON cr.CourseID = c.CourseID 
        WHERE scc.CourseID IS NULL
          AND EXISTS
          (   SELECT 1 FROM courserequirements cr1
              WHERE cr1.CourseID <> c.CourseID
              AND cr1.reqid = c.courseid
          )
     )
)

演示

调整OP的答案以包括特定的用户ID ...

SELECT c.*, sc.* 
FROM semestercourses AS sc 
NATURAL LEFT JOIN course AS c 
NATURAL LEFT JOIN courserequirements AS cr
NATURAL LEFT JOIN studentcoursecomplete AS scc
WHERE sc.CourseID NOT IN 
(   SELECT CourseID 
    FROM studentcoursecomplete WHERE sid = 1
)
    AND (cr.RequirementID IS NULL OR cr.RequirementID IN 
    (   SELECT CourseID 
        FROM studentcoursecomplete WHERE sid = 1
    )
)
SELECT c.*, sc.* FROM semestercourses AS sc
NATURAL LEFT JOIN course AS c 
NATURAL LEFT JOIN courserequirements AS cr
NATURAL LEFT JOIN studentcoursecomplete AS scc  
WHERE 
sc.CourseID NOT IN (SELECT CourseID FROM studentcoursecomplete)
    AND 
(cr.RequirementID IS NULL OR cr.RequirementID IN (SELECT CourseID FROM studentcoursecomplete))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM