MYSQL返回结果,其中至少有一个来自另一个表

时间:2014-04-24 00:07:53

标签: mysql

说我有两张表中的这些数据:

学生表列:

id | name 

课程表列:

id | code | name

我想使用Student.id AS Student和Course.id AS课程 得到以下内容:

Student | Course
-----------------  
1       |   C
1       |   B
1       |   A
2       |   F
2       |   B
2       |   A
3       |   C
3       |   B
3       |   F

我如何查询它以便它只返回带有课程C的学生和他们的其他课程,如下所示:

Student | Course
-----------------  
1       |   C
1       |   B
1       |   A
3       |   C
3       |   B
3       |   F

? 我试过了:

SELECT Student.id, Course.code FROM Course 
INNER JOIN Student ON Course.student = Student.id
WHERE Course.code = 'C'

但我只有

Student | Course
-----------------  
1       |   C
3       |   C

3 个答案:

答案 0 :(得分:2)

SELECT  s.id, c.code 
FROM    Course c
        INNER JOIN Student s
            ON c.student = s.id
WHERE   EXISTS
        (
            SELECT  1
            FROM    Course c1
            WHERE   c.student = c1.student
                    AND c1.Course = 'C'
        )

答案 1 :(得分:1)

解决此问题的最有效方法通常是内联视图和JOIN操作,但有几种方法可以获得相同的结果。

SELECT Student.id
     , Course.code 
  FROM ( SELECT c.Student
           FROM Course c
          WHERE c.code = 'C'
          GROUP BY c.Student
       ) o
 JOIN Course
   ON Course.Student = o.Student
 JOIN Student
   ON Student.id = Course.Student

在这里,我们使用内嵌视图(别名为o)来获取学生参加课程代码的列表=' C'。

(注意:我的答案中的查询是基于您的原始查询。如果在课程和学生之间有外键定义,我们只需要返回Student.id,我们可以通过省略加入学生,并在SELECT列表中返回Course.Student AS id代替Student.id。)

答案 2 :(得分:0)

这里第一个JOIN只选择那些有C课程的学生,第二个JOIN为你提供每个学生的所有课程。

SELECT st.id, c2.code FROM 
Student st 
JOIN Course c ON c.student = st.id AND c.code = "C"
JOIN Course c2 ON c2.student = st.id

你实际上在这里甚至不需要两张桌子,因为学生和课程都可以在课程表中找到,只需加入它自己:

SELECT c2.student, c2.code FROM 
Course c JOIN Course c2 ON c.student = c2.student
WHERE c.course = "C"

这里的WHERE子句会留下具有课程C的学生ID,然后你加入那些以查找所有课程。