Mysql帮助 - 左连接

时间:2011-04-11 15:23:35

标签: mysql sql database left-join

我经常读其他帖子,这是我的第一个问题。开始;

我正在尝试构建一个涉及两个表的课程,即课程表和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

我基本上试图获得所有可用课程的结果集,其中一个是特定学生注册的,哪一个不是,所以我将能够将其显示为我们可以提供的课程学生。

我尝试过这个查询的许多变体并进行了一些研究。我并不是要求代码,但是一些指导会非常棒。在尝试同时处理项目的其他部分时,我已经坚持了几天。

非常感谢任何帮助。提前谢谢。

3 个答案:

答案 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)

这可能需要一些调整,我不确定确切的语法,但它可能是如何获得你需要的想法。