【问题标题】:In MySQL - Looking for the names of students who are taking two courses在 MySQL 中 - 寻找参加两门课程的学生的姓名
【发布时间】:2015-02-09 08:22:17
【问题描述】:

这是我的桌子:

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


    【解决方案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'
    )
    

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

    【讨论】:

    • 我认为major table是一个红鲱鱼 - 只是寻找在部门学习课程的学生,而不是主修......
    • 哦,你可能是对的。我的查询适用于专业,而不是课程。但同样的原则也适用,只需更换课程的专业并进行适当的连接。
    • 执行两个查询并使用 IN 运算符对于性能来说是重量级的——如果存在正确的索引,使用更多的 JOIN 会快得多......我想我会坚持我的答案;)
    【解决方案2】:

    我使用了更多连接,并根据您提供的内容推断了关系。这将返回学生姓名和 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
    

    【讨论】:

      【解决方案3】:

      您可以使用两个单独的连接,第一个将测试 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
      

      【讨论】:

      • 这只是因为它看起来像部门名称(如dname)作为字符串包含在登记表中。
      【解决方案4】:

      我会使用聚合和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 子句中添加更多条件非常容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-02
        相关资源
        最近更新 更多