学生有导师,他们也是学生。如何获得指导超过4人的学生的名字?

时间:2019-09-22 10:55:07

标签: sql

students表具有4个字段。学生证,姓名,所在地和导师证。指导者ID指向学生ID。学生可以指导很多人,但是一个人只能有一位指导者。

我想出的两种方法如下:

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)

OR

SELECT s2.Name
FROM students s
JOIN students s2 ON s2.Id = s.MentorId
GROUP BY s2.Name
HAVING COUNT(s2.Name) > 4

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

谢谢!

3 个答案:

答案 0 :(得分:1)

不,它们是不正确的,但这只是一个小而简单的错误。 (两者都存在相同的错误)。

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

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 :(得分:0)

我将从聚合开始。指导4名以上学生的学生的方式如下:

select s.mentorid
from students s
group by s.mentorid
having count(*) > 4;

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

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;

答案 2 :(得分:0)

  1. 您正在按s2.name分组,其中s2.name的数量比4大。永远不要在分组和聚合函数中使用相同的字段。您真正想要的是按s2.name进行分组,其中s.name的数量为GROUP BY mentor HAVING COUNT students > 4(您要为每个导师的导师:s.id计算相应的学生)
  2. 您应该实际上使用SELECT s2.Name FROM students s JOIN students s2 ON s2.Id = s.MentorId GROUP BY s2.Name HAVING COUNT(s.id) > 4 ,因为如果您有几个同名学生,否则它将不起作用
{{1}}

经过测试,可以正常运行:)