带条件的SQLite中的内部联接语句

时间:2018-09-08 21:58:14

标签: sql join sqlite inner-join

如果我们有以下两个表“ teachers”和“ classes”,我们如何使用INNER JOIN语句生成最终表,其中(i)“ class_count”必须至少为2才能包含一名教师在最终表中;(ii)一个类别的“评分”必须至少为50,才能将一个类别计入“ average_rating”计算?

“老师”表

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;

2 个答案:

答案 0 :(得分:1)

似乎您只错过了GROUP BY子句。

将表加入类的ID。在WHERE子句中,过滤所需的class_countrating。然后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表中,因为每当老师教的课有变化时,都需要更新该值。如果这样的更新被遗忘或失败,也很危险,那就是该值是错误的。

答案 1 :(得分:1)

好的,这是正确的答案。好吧,您几乎明白了-只是错过了两件事: 首先没有GROUP BY(您必须始终在聚合函数中包含此语句,然后才是class_count字段-但您必须根据评分总和除以类别数(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