gpt4 book ai didi

MySQL HELP - 需要从所有类(class)的三个表中打印,其中注册的学生少于六名

转载 作者:行者123 更新时间:2023-11-29 12:39:28 25 4
gpt4 key购买 nike

说明是“打印所有注册学生少于六人的类(class)的类(class)名称、类(class)编号和部分编号。”

我提出了两个查询,想知道是否有人可以告诉我我做错了什么,或者您是否可以指导我获得结果。我尝试运行这两个查询,但没有得到任何结果。我完全不知道将 <6 语句放在第二个查询中的何处。

这是我的表格:

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)

CREATE TABLE course (
cno INT,
cname VARCHAR(100),
dname VARCHAR(100)
);

INSERT INTO course VALUES ( 302, 'Intro to Programming', 'Computer Sciences' );
INSERT INTO course VALUES ( 310, 'Thermodynamics', 'Chemical Engineering' );

查询1:

SELECT course.cname, course.cno, enroll.sectno, COUNT (*)
FROM course
JOIN enroll on enroll.cno = course.cno AND enroll.sid = student.sid
WHERE COUNT(*)<6;
GROUP BY cname, cno, sectno;

查询2:

SELECT course.cname, course.cno, enroll.cno, enroll.sectno, COUNT (*)
FROM course, enroll, student
WHERE course.cno = enroll.cno AND enroll.sid = student.sid
GROUP BY cname, cno, sectno;

我正在测试此查询来运行我的程序:

SELECT course.cname, course.cno, enroll.sectno, COUNT (*)
FROM course
JOIN enroll on enroll.cno = course.cno AND enroll.sid = student.sid
GROUP BY cname, cno, sectno
HAVING COUNT(*)<6;

最佳答案

您应该将计数移至 HAVING条款。 WHERE用于过滤传入数据(来自表)。剩余的数据将被处理,并根据您的情况进行汇总(计数)。之后,您可以使用HAVING过滤这些聚合结果。子句:

SELECT course.cname, course.cno, enroll.sectno, COUNT (*)
FROM course
JOIN enroll on enroll.cno = course.cno AND enroll.sid = student.sid
GROUP BY cname, cno, sectno
HAVING COUNT(*)>6

参见Having vs. Where Clause .

另请注意,查询中间有一个分号。这基本上将查询分为两个查询,其中一个查询是愚蠢的,另一个查询显然是无效的。请使用合适的工具,它不会只是返回“无”,而是会显示语法错误的实际错误消息,否则调试将非常麻烦。

{编辑}

经过讨论和您修改后的问题,我认为问题是您还没有任何学生(或者至少根本没有链接到类(class)。此外, > 6 应该是 < 6 。查询将是:

SELECT c.cname, c.cno, e.sectno, COUNT(e.sid) as studentcount
FROM course c
LEFT JOIN enroll e on e.cno = c.cno
GROUP BY c.cname, c.cno, e.sectno
HAVING COUNT(e.sid) < 6

这里修复了一些问题:

  • JOIN更改为LEFT JOIN ,所以如果没有 enroll 仍然返回类(class)根本就没有相关记录。
  • COUNT(*)更改为COUNT(enroll.sid) ,因此如果没有学生注册该类(class),它将返回 0(否则它将返回 1,因为它计算“任何”字段,包括类(class)本身的字段)。
  • > 6更改为< 6因为您想要开设少数学生的类(class)。
  • enroll.sid 的加入至student.sid去掉了。此连接不完整。条件已经存在,但您根本没有在查询中包含学生表,这使得查询无效。您不需要学生表,因为您只需计算学生 ID,这些 ID 也在 enroll 中。 ,所以我完全省略了该连接。
  • 我使用 GROUP BY 中的字段名称引用了表(别名)。子句,否则你可能会收到“不明确的列名”错误,尽管我不确定 MySQL 如何处理这种情况。无论如何,在任何地方使用表名或别名都会使其更具可读性。
  • 我在表中添加了别名(不需要,但我认为它更具可读性。只是一个意见。)

剩下的问题是是否需要按e.sectno分组,但这需要你自己去弄清楚。 :)

关于MySQL HELP - 需要从所有类(class)的三个表中打印,其中注册的学生少于六名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26319477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com