如何找到等级最高的人

问题描述 投票:0回答:1

在我的PieCloudDB数据库中,我有一个用户表和一个成绩表,其中成绩表记录了用户的成绩信息。 (示例数据)。

用户:

id 名字
1 巴克
2 怜悯
3 尼卡
4 卡米尔
5 雏菊

年级信息:

用户ID 年级号 类型
1 5 添加
2 4 添加
1 1 减少
3 2 添加
4 2 添加
5 3 添加
3 1 减少
4 2 添加

例如,第一行表示 user_id 1 的用户获得了 5,第三行表示该用户随后损失了 1。

我想使用 SQL 查询找到等级最高的用户的 id、姓名和总等级。可能有多个具有相同等级的用户。查询结果应按id升序排序。上面例子的结果如下:

id 名字 总成绩
1 巴克 4
2 怜悯 4
4 卡米尔 4

我尝试了以下方法,但我觉得我的方法太复杂了。有没有更简单的查询?

SELECT u.id, u.name, g.total_grade
FROM users u
JOIN (
    SELECT user_id, SUM(
        CASE WHEN type = 'add' THEN grade_num
             WHEN type = 'reduce' THEN -grade_num
             ELSE 0
        END
    ) AS total_grade
    FROM grade_info
    GROUP BY user_id
) g ON u.id = g.user_id
WHERE g.total_grade = (
    SELECT MAX(total_grade)
    FROM (
        SELECT user_id, SUM(
            CASE WHEN type = 'add' THEN grade_num
                 WHEN type = 'reduce' THEN -grade_num
                 ELSE 0
            END
        ) AS total_grade
        FROM grade_info
        GROUP BY user_id
    ) max_grades
)
ORDER BY u.id;
query-optimization
1个回答
0
投票

您可以在 PieCloudDB 数据库中使用 CTE(通用表表达式)语法进行查询。这可能对你有帮助:

with tg AS
    (select
     u.id, u.name, sum(case when gi.type='add' then gi.grade_num else -gi.grade_num end) total_grade
    from users u , grade_info gi
    where u.id = gi.user_id
    group by 1,2
    )
select * from tg
where total_grade = (select max(total_grade) from tg)
order by id;
© www.soinside.com 2019 - 2024. All rights reserved.