SQLite中的内连接语句,条件[关闭]

问题描述 投票:-1回答:2

如果我们有以下两个表,“教师”和“类”,我们如何使用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;
sql join sqlite inner-join
2个回答
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
投票

好的,这是正确的答案。好吧你几乎得到了它 - 只是错过了两件事:首先没有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
© www.soinside.com 2019 - 2024. All rights reserved.