我经常读其他帖子,这是我的第一个问题。开始;
我正在尝试构建一个涉及两个表的课程,即课程表和studentsLink表。 StudentsLink表描述了学生与课程之间的联系。表格如下;
Course
courseID(bigint) - PK
courseName (varchar)
courseInstructor (varchar)
StudentsLink
courseID(bigint) - PK
StudentID(bigint) - PK
Below is some sample data;
course table
ID | courseName| courseInstructor
----------------------------------
1 | Algebra 1 | Mike
2 | English 2 | James
3 | English 3 | John
4 | Algebra 2 | Mike
5 | History 1 | Tony
Studentlink table
studentID | courseID
----------------------
100 | 2
101 | 3
102 | 3
102 | 4
103 | 4
100 | 1
103 | 3
103 | 2
如果我正在寻找103号学生,那么期望的结果如下所示
ID | courseName| courseInstructor |StudentID | CourseID
---------------------------------------------------------
1 | Algebra 1 | Mike | NULL | NULL
2 | English 2 | James | 103 | 2
3 | English 3 | John | 103 | 3
4 | Algebra 2 | Mike | 103 | 4
5 | History 1 | Tony | NULL | NULL
我到目前为止的查询如下:
SELECT *
FROM course
LEFT JOIN studentLink
ON course.courseID = studentLink.courseID
WHERE studentLink.studentID = 103 OR (studentLink .studentID IS NULL AND studentLink.courseID IS NULL)
ORDER BY studentLink.courseID DESC
我基本上试图获得所有可用课程的结果集,其中一个是特定学生注册的,哪一个不是,所以我将能够将其显示为我们可以提供的课程学生。
我尝试过这个查询的许多变体并进行了一些研究。我并不是要求代码,但是一些指导会非常棒。在尝试同时处理项目的其他部分时,我已经坚持了几天。
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:1)
SELECT ID, CourseName, CourseInstructor, StudentId, CourseId
FROM Courses as c
LEFT JOIN StudentLink as sl ON c.id = sl.CourseId And StudentId = 103
答案 1 :(得分:1)
这里的问题是你加入然后过滤,你需要在连接点过滤
SELECT *
FROM course
LEFT JOIN studentLink
ON course.courseID = studentLink.courseID and studentLink.studentID = 103
ORDER BY course.courseID DESC
这应该可行(假设mysql允许你在连接逻辑上有多个谓词,认为它确实有,但没有要测试的实例)
如果没有,您可以加入为您应用限制的子查询。
SELECT *
FROM course
LEFT JOIN
(select * from studentLink where studentID = 103) as sl
ON course.courseID = sl.courseID
ORDER BY course.courseID DESC
答案 2 :(得分:0)
您可以轻松地使用您的左连接(没有或在哪里)获得学生所在的那些
然后你可以让其他人使用not in作为工会的一部分......
在您查询的第一部分后,您可以执行类似......
的操作SELECT * FROM course LEFT JOIN studentLink ON course.courseID = studentLink.courseID WHERE studentLink.studentID = 103
union
select * FROM course LEFT JOIN studentLink ON course.courseID = studentLink.courseID
WHERE courseID NOT IN ( select course.courseID FROM course LEFT JOIN studentLink ON course.courseID = studentLink.courseID WHERE studentLink.studentID = 103)
这可能需要一些调整,我不确定确切的语法,但它可能是如何获得你需要的想法。