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还是代码错误。
谢谢!
答案 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;
要获取完整的学生记录,您可以使用in
,exists
或join
:
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)
s2.name
分组,其中s2.name
的数量比4
大。永远不要在分组和聚合函数中使用相同的字段。您真正想要的是按s2.name
进行分组,其中s.name
的数量为GROUP BY mentor HAVING COUNT students > 4
(您要为每个导师的导师:s.id
计算相应的学生)SELECT s2.Name
FROM students s
JOIN students s2 ON s2.Id = s.MentorId
GROUP BY s2.Name
HAVING COUNT(s.id) > 4
,因为如果您有几个同名学生,否则它将不起作用{{1}}
经过测试,可以正常运行:)