首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学生有导师,导师也是学生。如何获得指导人数超过4人的学生的姓名?

学生有导师,导师也是学生。如何获得指导人数超过4人的学生的姓名?
EN

Stack Overflow用户
提问于 2019-09-22 18:55:07
回答 3查看 91关注 0票数 0

“学生”表有4个字段。学生ID、姓名、位置和导师ID。导师ID指向学生ID。学生可以指导多人,但一个人只能有一个导师。

我提出的两种方法如下:

代码语言:javascript
复制
SELECT s.Name
FROM Students s
WHERE s.Id IN (SELECT s2.MentorId
               FROM Students s2
               GROUP BY s2.MentorId
               HAVING COUNT(s2.MentorId) > 4)

代码语言:javascript
复制
SELECT s2.Name
FROM students s
JOIN students s2 ON s2.Id = s.MentorId
GROUP BY s2.Name
HAVING COUNT(s2.Name) > 4

这些是正确的吗?他们不会为我奔跑。我不确定这是我的SQL错误还是我的代码错误。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2019-09-22 19:06:41

不,他们不是正确的,但这只是一个小的,简单的错误。(两者都犯了同样的错误)。

您在having子句中计算错误的列。就我个人而言,我倾向于第二种选择,只需将COUNT(s2.Name)替换为COUNT(s.Id) -如果您的数据库支持它,COUNT(DISTINCT s.Id)更好:

代码语言:javascript
复制
SELECT s2.Name
FROM students s
JOIN students s2 
    ON s2.Id = s.MentorId
GROUP BY s2.Name
HAVING COUNT(DISTINCT s.Id) > 4
票数 1
EN

Stack Overflow用户

发布于 2019-09-22 19:21:33

我将从聚合开始。指导4名以上学生的学生由以下人员提供:

代码语言:javascript
复制
select s.mentorid
from students s
group by s.mentorid
having count(*) > 4;

要获取完整的学生记录,可以使用inexistsjoin

代码语言:javascript
复制
select s.*  -- or whatever columns you like
from students s join
     (select s.mentorid
      from students s
      group by s.mentorid
      having count(*) > 4
     ) m
     on s.id = m.mentorid;
票数 0
EN

Stack Overflow用户

发布于 2019-09-22 22:15:14

  1. 您正在按s2.name分组,其中s2.name的数量大于4。分组和聚合函数永远不能使用相同的字段。在这里,您真正想要的是通过具有多个s2.names.name进行分组(您希望为每个导师计算相应的学生:GROUP BY mentor HAVING COUNT students > 4)
  2. You实际上应该使用

,因为如果您有几个学生具有相同的名字,则它将不起作用

代码语言:javascript
复制
SELECT s2.Name
FROM students s
JOIN students s2 ON s2.Id = s.MentorId
GROUP BY s2.Name
HAVING COUNT(s.id) > 4

经过测试,它可以正常工作:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58048496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档