0

架构:

Student (snum: integer, 
         sname: char(30), 
         major: char(25), 
         level: char(2), 
         age: integer)

Faculty (fid: integer, 
         fname: char(30), 
         deptid: integer)

Class (cname: char(40), 
       meets_at: char(20),
       room: char(10), 
       fid: integer | fid    REFS Faculty.fid)

Enrolled (snum: integer, 
          cname: char(40) | snum REFS student.snum, 
          cname REFS class.name)

问题:

P1。查找教过最多不同课程的教员姓名、系。

P2。查找注册人数大于 5 的所有班级的名称及其注册强度。

我的尝试:

#P1:
select distinct f.fname,max(distinct c.cname)
from faculty f,class c
where Exists (select c.fid,max(distinct c.cname) as myCount
from class c where
f.fid=c.fid);

#P2:
select distinct c.cname
from class c
where Exists (select c.cname
from enrolled e where
e.cname=c.cname and count(e.cname)>5);

但这给了我错误。请帮帮我。

4

2 回答 2

0

Q #1 : 做一个group by

select f.fname, COUNT(distinct c.cname)
from faculty f 
join class c
  on f.fid = c.fid
group by f.fname
order by COUNT(distinct c.cname) DESC
limit 1

使用相关查询:

相关的 v1:

SELECT *
FROM faculty f
WHERE f.id =  (SELECT c.fid
               FROM class c 
               GROUP BY c.fid
               ORDER BY COUNT(distinct c.cname) DESC
               LIMIT 1)

相关的 v2:

SELECT *
FROM (
      SELECT f.*, (SELECT COUNT(distinct c.cname)
                   FROM class c
                   WHERE c.fid = f.id) as total
      FROM faculty f
     ) T
ORDER By Total DESC
LIMIT 1
于 2016-11-16T19:52:24.297 回答
0

对于 P2,您可以使用连接来执行此操作,而无需嵌套查询。WHERE 子句中不允许对聚合函数执行条件,只能在 HAVING 子句中。您还必须首先对类名进行分组。

SELECT C.name, count(*) as enrollment
FROM Class C INNER JOIN Enrolled E
    ON C.cname=E.cname
GROUP BY C.name
HAVING count(*) > 5;

做一个相关的嵌套查询,试试这个:

SELECT C.cname, count(*) as enrollment_count
FROM Class C INNER JOIN Enrolled E
    ON C.cname = E.cname
WHERE EXISTS (SELECT *
              FROM Enrolled E
              WHERE E.cname = C.cname
              GROUP BY E.cname
              HAVING count(*) > 5)
GROUP BY C.cname;
于 2016-11-16T19:52:35.027 回答