当前位置: 首页 > 知识库问答 >
问题:

SQL -先从课程过滤,然后从科目过滤

曹乐意
2023-03-14

我需要有关此问题的帮助:

查询显示所有参加COSC121、COSC126和MATH111三门课程的CIS或UT学生的学生ID、姓名和课程。按学生ID排序结果。提示:考虑使用自连接。

以下是表格:

学生学号学生姓名计划

成绩学生_ID课程_ID成绩

这是我目前的情况。

SELECT s.student_id, s.stu_name, s.program
FROM students s, grades g
WHERE s.student_id = g.student_id AND
(program = 'CIS' OR program = 'UT') AND
course_id = 'COSC126'
ORDER BY student_id;

如果我将行course_id = “COSC126” 更改为 (course_id = “COSC121” 并且 course_id = “COSC126”,course_id = “MATH111”),我不会得到任何结果。提前感谢您!

共有2个答案

汪晟睿
2023-03-14

这是您的查询

select s.student_id, s.stu_name, s.program
from students s
inner join grades g on s.student_id = g.student_id 
inner join students t1 on t1.student_id = s.student_id and t1.course_id = 'COSC121'
inner join students t2 on t2.student_id = s.student_id and t2.course_id = 'COSC126'
inner join students t3 on t3.student_id = s.student_id and t3.course_id = 'MATH111'
where 
 s.program in ('CIS', 'UT') or t1.program in ('CIS', 'UT') or t2.program in ('CIS', 'UT')
or t3.program in ('CIS', 'UT')
蒋星驰
2023-03-14

根据自连接提示,我们可以尝试:

SELECT
    s1.student_id,
    s1.stu_name,
    s1.program
FROM students s1
INNER JOIN students s2
    ON s1.student_id = s2.student_id
INNER JOIN students s3
    ON s1.student_id = s3.student_id
WHERE
    s1.program IN ('CIS', 'UT') AND
    s1.course_id = 'COSC121' AND
    s2.course_id = 'COSC126' AND
    s3.course_id = 'MATH111';

不过,我通常使用聚合方法来解决此类问题:

SELECT
    student_id,
    stu_name,
    program
FROM students
WHERE
    program IN ('CIS', 'UT') AND
    course_id IN ('COSC121', 'COSC126', 'MATH111')
GROUP BY
    student_id,
    stu_name,
    program
HAVING
    COUNT(DISTINCT course_id) = 3;
 类似资料:
  • 首先,请让我知道我正在做的是不是对dplyr的不当使用,因为我不确定我是否以最佳方式实现了这一点。我有以下数据帧: 我想做的过滤有点罗嗦,但我会尝试-我想通过删除col1 == '0 '的所有行来过滤数据帧,如果该行出现在该用户的第一行之后,其中col1 == '1 '。(粗体表示我把原问题搞砸了,把0和1调换了)。 例如,对于用户7,第3行的col1 == '1 ',所以我想过滤第3行之后col

  • 问题内容: 我在使用棘手的SQL查询时遇到了一些麻烦。 在我的MySQL数据库中,有表主题,标签和tags_topics可以将它们连接起来。我想获取共享相同指定标签的主题。例如,假设我有3个ID为1、2和3的标签,我想获取所有与标签1、2和3相关联的主题。主题可以具有其他标签,但必须具有所有指定的标签。 帮我思考一下plz xD 编辑:在以下问题中找到了使用GROUP BY的解决方案:仅获取与联接

  • 问题内容: 我在页面上使用angularjs。我想过滤JSON对象中的值,以便不存在冗余。但是我没有找到任何方法可以从角度ng-repeat中获得唯一值。反正有做吗? 好的,这是有关该问题的一些描述。我有这种格式的JSON。我从服务中获取此JSON。因此,我们不能期望重复数据如何发生。 我希望输出JSON不包含重复的元素,这样我的输出将是这样的 问题答案: 您可以使用已定义过滤器的Angular

  • 问题内容: 我有一个带有许多字段的表。我正在尝试在asp.net中创建搜索过滤器,以便用户可以按一个或多个字段进行搜索。所以基本上我想创建一个包含4个参数的存储过程,如果它不为null,它将把参数附加到WHERE子句中。 TableExample有4列,Col1 Col2 Col3 Col4 我希望有一种方法可以用一个存储过程完成此操作,而不必为每种可能的组合创建一个。 我正在尝试类似的方法,虽然

  • 这是我在这里的第一篇帖子,而且我是一个初学者,所以请耐心听我说。 我想完成的是创建一个AJAX函数,该函数将以复选框的形式列出所有可用类别,用户可以从中选择。选择并点击“应用”后,我想显示分配给所选类别的帖子中所有标签的列表(也以复选框的形式)。然后用户可以从可用的标签中进行选择,然后在点击最后的“应用”按钮后,将显示相应的帖子。 类似于TED. com的“你感兴趣的是什么?”但是在AJAX中。所

  • 问题内容: 我有一个MySql表,我想查询其中 成对 的列在特定集中的行。例如,假设我的表格如下所示: 现在,我希望提取其中 (f1,f2) 对为(’a’,30)或(’b’,20)的行,即行2,3,4。我也希望使用“ IN”样式的过滤器来完成此操作,因为我可能有很多对要提取。如果我尝试类似的方法: 我得到IN子句中为f1和f2指定的值的笛卡尔积,即具有f1 =’a’或’b’的所有可能组合的行,以及