如果我们有以下两个表,“教师”和“类”,我们如何使用INNER JOIN语句来生成最终表格,其中(i)“class_count”必须至少为2才能让教师被列入最终表格和(ii)在“average_rating”计算中,一个班级的“评级”必须至少为50?
“老师”表
teachers
class_id teacher_id teacher_name class_count
1111 1234 Smith 2
4444 2345 Jones 3
2222 1234 Smith 2
5555 2345 Jones 3
3333 5678 Taylor 2
6666 2345 Jones 3
7777 5678 Taylor 2
8888 6789 Thomas 1
“班级”表
classes
id class_name rating
1111 Math 60
2222 Biology 70
3333 Psychology 50
4444 Physics 80
5555 Chemistry 30
6666 Economics 60
7777 Computing 70
8888 Statistics 90
我们希望决赛桌看起来像:
teacher_id teacher_name average_rating
1234 Smith 65
2345 Jones 70
5678 Taylor 60
我在sqlite中尝试了以下代码,但它没有给出正确的结果(如上面的最终表中所示)。
SELECT t.teacher_id, t.teacher_name, SUM(c.rating) / t.class_count
FROM teachers t
INNER JOIN classes c on c.id = t.class_id
WHERE c.rating >= 50 AND t.class_count >= 2;
看起来你只想念一个GROUP BY
条款。
加入关于类的ID的表。在WHERE
子句过滤器中为所需的class_count
和rating
。然后GROUP BY
教师的ID和名称,并使用你的计数表达式来计算平均评级。
SELECT t.teacher_id,
t.teacher_name,
sum(t.rating) / t.class_count average_rating
FROM teachers t
INNER JOIN classes c
ON c.id = t.class_id
WHERE t.class_count >= 2
AND t.rating >= 50
GROUP BY t.teacher_id,
t.teacher_name;
但是你的架构并不是最好的。
而不是为他们教的每个班级重复教师,在teachers
表中每个教师应该只有一行。
哪位老师教导哪个班级应该存储在包含班级ID和教师ID的链接表中。
还可以查询教师教授的课程数量。它不应该物理存储在teachers
表中,因为这需要在教师教授的课程发生变化时更新值。如果这样的更新被遗忘或失败,那么价值也是错误的也是危险的。
好的,这是正确的答案。好吧你几乎得到了它 - 只是错过了两件事:首先没有GROUP BY(你必须包含这个语句总是使用agregate函数,然后有字段class_count - 但你必须从评级的SUM中计算平均评级与班级数(COUNT(*))。
因此,如果您在问题结尾处的结果是正确的,那么下面的代码也是正确的。
SELECT
t.teacher_id,
t.teacher_name,
SUM(c.rating) / COUNT(*) as average_rating
FROM teachers t
INNER JOIN classes c on
c.id = t.class_id
WHERE
t.class_count >= 2 and
c.rating >= 50
GROUP BY
t.teacher_id,
t.teacher_name
ORDER BY
t.teacher_id
- 结果:
teacher_id teacher_name average_rating
1234 Smith 65.000000
2345 Jones 70.000000
5678 Taylor 60.000000