2011-04-11 73 views
2

我通常阅读其他线程,这是我的第一个问题。开始;Mysql帮助 - 左加入

我想建立一个涉及两个表,课程表和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 

基本上,我试图让设置了所有可用的课程,哪一个是特定的学生在注册的结果,哪一个是他不是这样我就可以显示它作为一门课程,其我们可以提供给学生。

我已经尝试了这个查询的许多变化,并做了一些研究。我不完全要求编码,但一点指导会很棒。在尝试同时处理项目的其他部分时,我一直坚持这几天。

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

回答

1
SELECT ID, CourseName, CourseInstructor, StudentId, CourseId 
FROM Courses as c 
LEFT JOIN StudentLink as sl ON c.id = sl.CourseId And StudentId = 103 
0

您可以轻松地获得那些学生在使用LEFT JOIN(W/O型的,或在哪里)

然后,您可以得到其他地方使用不作为联盟的一部分...

你可以做类似的查询您的弗里斯特部分之后...

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) 

这可能会采取一些调整,我不知道确切的语法,但它是一个可能如何获得你所需要的想法。

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