获取平均分高于某个值的老师教授的课程
Posted
技术标签:
【中文标题】获取平均分高于某个值的老师教授的课程【英文标题】:Get the courses taught by a teacher which average score is above a value 【发布时间】:2014-09-14 13:28:01 【问题描述】:这里有 2 个表及其关系。一个老师可以教不止一门课程。 Course 和 Course_Score 之间的关系是 1:n。学生的分数存储在 course_score 中。
Course(cid, tid*) [1 ------n] Course_Score(cid*, sid*, score )
斜体 属性是主键。标有 * 的属性是外键。比如,sid* 是学生证。 tid* 是教师 ID。
如何获取该老师所教课程的平均分都在80以上的老师ID?
我在下面尝试过,但没有成功,因为它返回的数据多于应返回的数据。
从存在的课程中选择 tid (SELECT avg(score) FROM course_score 自然加入课程 GROUP BY cid HAVG (score) > 80);
【问题讨论】:
“没用”是什么样的? 【参考方案1】:将这个问题重新表述为“向我展示没有平均分数为 80 或以下的课程的老师”会更容易:
select
tid
from
teacher t
where
not exists (
select
'x'
from
course_score cs
inner join
course c
on cs.cid = c.cid
where
c.tid = t.tid
group by
c.cid
having
avg(score) <= 80
);
对于是否应包括教授零课程的教师可能存在一些争论。
Here's an example to show it works
需要注意的一点是,计算 int 字段的平均值可能很棘手,因为答案可能会四舍五入为 int。将其更改为 avg(cast (score as decimal))
以解决此问题。
【讨论】:
那不是要在所有情况下都给出正确答案的关系划分吗?这肯定比纠正 OP 已经拥有的更复杂。 @PieterGeerkens 即使您进行了修复,OP 仍在挑选至少教授过一门课程且平均分超过 80 分的教师。该问题询问所有课程平均分超过 80 分的教师。 这将返回零记录。某处可能有问题。 @canoe 发布一些测试数据。【参考方案2】:您正在从 courses 中选择您的 tid 值;当然你得到的行太多了。
相反,将查询的顶部更改为:
SELECT tid FROM teacher
更新刚刚在规范中看到“all above”*。
SELECT teacher.tid
FROM teacher
JOIN (
SELECT tid,cid, avg(score) as avg_score
FROM course_score
JOIN course on course.cid = course_score.cid
GROUP BY tid,cid
)scores
on scores.tid = teacher.tid
GROUP BY teacher.tid
HAVING min(avg_score) > 80
【讨论】:
您正在使用另一个很酷的解决方案!但是子查询SELECT tid,cid, avg(score) as avg_score FROM course_score
可能无法工作,因为 tid 不在 course_score 表中。以上是关于获取平均分高于某个值的老师教授的课程的主要内容,如果未能解决你的问题,请参考以下文章