在MySQL中 - 寻找正在上两门课程的学生的名字

时间:2014-12-10 23:37:17

标签: mysql

这是我的表:

Student(sid,sname,sex,age,year,qpa)
Dept(dname,numphds)
Prof (pname,dname)
Course (cno,cname,dname)
Major(dname,sid)
Section(dname,cno,sectno,pname)
Enroll(sid,grade,dname,cno,sectno)

我已经尝试了几个代码来提出解决问题的解决方案"打印同时参加计算机科学课程和数学课程的学生的姓名。"但是,我没有得到任何结果填充。

我的第一次尝试"没有填充结果/没有错误":

SELECT student.sid, student.sname
FROM student
INNER JOIN major ON major.sid = student.sid
AND major.dname LIKE '%Computer Sciences%' AND '%Mathematics%'
GROUP BY student.sname, major.dname 

第二次尝试"没有填充结果/没有错误":

SELECT student.sid, student.sname, course.dname
FROM student, course
INNER JOIN major ON major.dname = course.dname 
WHERE course.dname = '%Computer Sciences%'
AND course.dname = '%Mathematics%'

第三次尝试使用错误消息:"未知列' student.dname'在' where子句'":

    SELECT student.sid, student.sname
    FROM student
    WHERE EXISTS (SELECT * FROM major WHERE major.dname=student.dname LIKE '%Computer Sciences%'  AND      '%Mathematics%')

有人可以指出我正确的方向......

4 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点,尽管没有一种方法特别优雅。这是一种方法:

SELECT student.sid, student.sname
FROM student
INNER JOIN major ON major.sid = student.sid
WHERE major.dname = 'Computer Sciences'
AND student.sid IN (
    SELECT student.sid
    FROM student
    INNER JOIN major ON major.sid = student.sid
    WHERE major.dname = 'Mathematics'
)

这将获得所有数学学生的列表,然后比较该列表以查看哪些学生在计算机科学中。你最终得到了两者兼而有之的学生名单。

答案 1 :(得分:0)

我使用更多联接并推断出与您提供的关系。这将返回学生姓名和ID,其中学生来自每个部门的一个班级。 GROUP BY是必要的,只有在学生在其中一个部门学习多门课程时才能消除重复。

SELECT student.sid, student.sname
FROM student
JOIN enroll e1 ON e1.sid=student.sid
JOIN course c1 ON c1.cno=e1.cno
JOIN enroll e2 ON e2.sid=student.sid
JOIN course c2 on c2.cno = e2.cno
WHERE c1.dname LIKE '%Mathematics%'
AND c2.dname LIKE '%Computer Science%'
GROUP BY student.sid

答案 2 :(得分:0)

您可以使用两个单独的连接,第一个将测试CS专业,第二个将测试数学:

SELECT student.sid, student.sname
FROM student
INNER JOIN enroll AS enroll1 
     ON enroll1.sid = student.sid AND enroll1.dname = '%Computer Sciences%'
INNER JOIN enroll AS enroll2
     ON enroll2.sid = student.sid AND enroll2.dname = '%Mathematics%'
GROUP BY student.sname, major.dname

答案 3 :(得分:0)

我会使用聚合和having子句来完成此操作。我发现这比使用连接的方法更具概括性:

SELECT s.sid, s.sname
FROM student s INNER JOIN
     major m
     ON m.sid = s.sid
GROUP BY s.sname, s.sname
HAVING SUM(m.dname LIKE '%Computer Sciences%') > 0 AND
       SUM(m.dname LIKE '%Mathematics%') > 0;

having条款中的每个条件都会计算参加特定课程的学生人数。 > 0表示至少有一个。如果要添加第三或第四组课程,可以通过在HAVING子句中添加更多条件来轻松实现。