在 MySQL - 查找参加两门课程的学生姓名

问题描述 投票:0回答:5

这是我的桌子:

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%'

第三次尝试出现错误消息:“‘where 子句’中的未知列‘student.dname’”:

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

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

mysql
5个回答
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'
)

这会获取所有数学专业学生的列表,然后比较该列表以查看哪些学生属于计算机科学专业。您最终会得到一份同时属于这两个专业的学生名单。


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

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

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
子句中添加更多条件即可非常简单。


0
投票

锻炼身体。列出女学生姓名 2. 列出 SE 系所有学生 3. 列出 CS 系女学生姓名 4. 列出学业状态为 Pass 的女学生姓名和部门 5. 列出男学生姓名、id 和部门除 Asmare 和 Sisay 6. 列出所有名字以“A”开头并以“ew”结尾的学生的姓名、性别和年龄 7. 显示工资在 10 至 15 千之间的教师姓名 8. 显示全部学业状态尚未确定的学生

© www.soinside.com 2019 - 2024. All rights reserved.