“学生”表有4个字段。学生ID、姓名、位置和导师ID。导师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)或
SELECT s2.Name
FROM students s
JOIN students s2 ON s2.Id = s.MentorId
GROUP BY s2.Name
HAVING COUNT(s2.Name) > 4这些是正确的吗?他们不会为我奔跑。我不确定这是我的SQL错误还是我的代码错误。
谢谢!
发布于 2019-09-22 19:06:41
不,他们不是正确的,但这只是一个小的,简单的错误。(两者都犯了同样的错误)。
您在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发布于 2019-09-22 19:21:33
我将从聚合开始。指导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;发布于 2019-09-22 22:15:14
s2.name分组,其中s2.name的数量大于4。分组和聚合函数永远不能使用相同的字段。在这里,您真正想要的是通过具有多个s2.name的s.name进行分组(您希望为每个导师计算相应的学生:GROUP BY mentor HAVING COUNT students > 4),因为如果您有几个学生具有相同的名字,则它将不起作用
SELECT s2.Name
FROM students s
JOIN students s2 ON s2.Id = s.MentorId
GROUP BY s2.Name
HAVING COUNT(s.id) > 4经过测试,它可以正常工作:)
https://stackoverflow.com/questions/58048496
复制相似问题