【问题标题】:Using WHERE, HAVING, and GROUP BY in the same SQL query在同一个 SQL 查询中使用 WHERE、HAVING 和 GROUP BY
【发布时间】:2020-11-21 22:07:23
【问题描述】:

我正在尝试查找在 R128 房间开会或在这两个名为“enroll”和“class”的表中注册了五个或更多学生的所有班级的名称。我可以单独找到这个问题的两个部分,但我不明白如何在一个查询中找到它们。

这给了我想要的 R128 房间的课程:

SELECT class.cname
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
WHERE room='R128';

这给了我有 5 个或更多学生的班级:

SELECT class.cname
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
GROUP BY enroll.cname
HAVING COUNT(enroll.cname)>4;

我不知道如何将它们组合成一个查询。这是我到目前为止所拥有的,但它返回一个空集:

SELECT class.cname, COUNT(enroll.cname)
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
WHERE room='R128'
GROUP BY enroll.cname
HAVING COUNT(enroll.cname)>4;

这里是class tableenroll table

R128 室的课程是专利法、数据结构、印加考古学、奶牛管理和数学概论。有 5 名或更多学生的课程是数据库系统和操作系统设计。

【问题讨论】:

    标签: sql count mariadb aggregate-functions having-clause


    【解决方案1】:

    这会产生你想要的结果吗?

    select c.cname
    from class c
    inner join enroll e on e.cname = c.cname
    group by c.cname
    having max(room = 'R128') = 1 or count(*) > 4
    

    【讨论】:

    • 这给出了我想要从两个表中得到的一些结果,但不是全部。具体来说,它找到了数据结构、数据库系统、操作系统设计和专利法等类。我添加了数据库的图片和它应该显示的类以澄清事情。感谢您的帮助
    【解决方案2】:

    假设roomclass中,我建议union

    select c.cname
    from class c
    where room = 'R128'
    union   -- on purpose to remove duplicates
    select e.cname
    from enroll e
    group by e.cname
    having count(*) >= 5;
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2021-04-25
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2022-01-15
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多