zoukankan      html  css  js  c++  java
  • SQL练习题(76-91)学习笔记(来源于牛客网)

    最近看到牛客的MySQL更新了,做了几道从后数的,和大家分享下。

    SQL76 考试分数(五)

    描述

    牛客每次考试完,都会有一个成绩表(grade),如下:

     

    第1行表示用户id为1的用户选择了C++岗位并且考了11001分

    。。。

    第8行表示用户id为8的用户选择了B语言岗位并且考了9999分

     

     

    请你写一个sql语句查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序,结果如下:

    解释:

    第1行表示C++岗位的中位数位置上的为用户id为2,分数为10000,在C++岗位里面排名是第2

    第2,3行表示Java岗位的中位数位置上的为用户id为4,5,分数为12000,13000,在Java岗位里面排名是第2,1

    第4行表示B语言岗位的中位数位置上的为用户id为7,分数为11000,在前端岗位里面排名是第2

     

     

     

     

    (注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5,sqlite四舍五入的函数为round,sqlite不支持floor函数,支持cast(x as integer) 函数,不支持if函数,支持case when ...then ...else ..end函数,sqlite不支持自定义变量)

    SELECT
    id,
    job,
    score,
    ranking
    FROM
    (SELECT
    id,
    job,
    score,
    ROW_NUMBER() OVER(PARTITION BY job ORDER BY score) AS situ1,
    ROW_NUMBER() OVER(PARTITION BY job ORDER BY score DESC) AS situ2,
    ROW_NUMBER() OVER(PARTITION BY job) AS ranking,
    COUNT(*) OVER(PARTITION BY job) AS total
    FROM
    grade
    ORDER BY
    id) AS t
    WHERE
    t.situ1 >= t.total / 2
    AND
    t.situ2 >= t.total / 2
    ORDER BY
    id
    ;
    

    SQL77 牛客的课程订单分析(一)

    描述

    有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里。

    有一个订单信息表(order_info),简况如下:

    第1行表示user_id为557336的用户在2025-10-10的时候使用了client_id为1的客户端下了C++课程的订单,但是状态为没有购买成功。

    第2行表示user_id为230173543的用户在2025-10-12的时候使用了client_id为2的客户端下了Python课程的订单,状态为购买成功。

    。。。

    最后1行表示user_id为557336的用户在2025-10-24的时候使用了client_id为1的客户端下了Python课程的订单,状态为没有购买成功。


    请你写出一个sql语句查询在2025-10-15以后状态为购买成功的C++课程或者Java课程或者Python的订单,并且按照order_info的id升序排序,以上例子查询结果如下:

     

    SELECT
    *
    FROM
    order_info
    WHERE
    date > '2025-10-15'
    AND
    product_name IN ('C++','Java','Python')
    AND
    status = 'completed'
    ORDER BY
    id ASC;
    
    SQL78 牛客的课程订单分析(二)

    描述

    有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里。

    有一个订单信息表(order_info),简况如下:

     

    第1行表示user_id为557336的用户在2025-10-10的时候使用了client_id为1的客户端下了C++课程的订单,但是状态为没有购买成功。

    第2行表示user_id为230173543的用户在2025-10-12的时候使用了client_id为2的客户端下了Python课程的订单,状态为购买成功。

    。。。

    最后1行表示user_id为557336的用户在2025-10-25的时候使用了client_id为1的客户端下了C++课程的订单,状态为购买成功。

    请你写出一个sql语句查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程的user_id,并且按照user_id升序排序,以上例子查询结果如下:

     

    解析:

    id为4,6的订单满足以上条件,输出对应的user_id为57;

    id为5,7的订单满足以上条件,输出对应的user_id为557336;

    按照user_id升序排序。
     
    SELECT
    user_id
    FROM
    order_info
    WHERE
    date > '2025-10-15'
    AND
    product_name IN ('C++','Java','Python')
    AND
    status = 'completed'
    GROUP BY
    user_id
    HAVING
    COUNT(*) >= 2
    ORDER BY
    user_id ASC;
    

    SQL79 牛客的课程订单分析(三)

    描述

    有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里。

    有一个订单信息表(order_info),简况如下:

     

    第1行表示user_id为557336的用户在2025-10-10的时候使用了client_id为1的客户端下了C++课程的订单,但是状态为没有购买成功。

    第2行表示user_id为230173543的用户在2025-10-12的时候使用了client_id为2的客户端下了Python课程的订单,状态为购买成功。

    。。。

    最后1行表示user_id为557336的用户在2025-10-25的时候使用了client_id为1的客户端下了C++课程的订单,状态为购买成功。

    请你写出一个sql语句查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程的订单信息,并且按照order_info的id升序排序,以上例子查询结果如下:

     

    解析:

    id为4,6的订单满足以上条件,输出它们的对应的信息;

    id为5,7的订单满足以上条件,输出它们的对应的信息;

    按照id升序排序

    SELECT
    *
    FROM
    order_info
    WHERE
    date > '2025-10-15'
    AND
    product_name IN ('C++','Java','Python')
    AND
    status = 'completed'
    AND  
    user_id IN
    (SELECT
    user_id
    FROM
    order_info
    WHERE
    date > '2025-10-15'
    AND
    product_name IN ('C++','Java','Python')
    AND
    status = 'completed'
    GROUP BY
    user_id
    HAVING
    COUNT(*) >= 2
    ORDER BY
    id ASC)
    ;
    

    SQL80 牛客的课程订单分析(四)

    描述

    有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里。

    有一个订单信息表(order_info),简况如下:

    第1行表示user_id为557336的用户在2025-10-10的时候使用了client_id为1的客户端下了C++课程的订单,但是状态为没有购买成功。

    第2行表示user_id为230173543的用户在2025-10-12的时候使用了client_id为2的客户端下了Python课程的订单,状态为购买成功。

    。。。

    最后1行表示user_id为557336的用户在2025-10-25的时候使用了client_id为1的客户端下了Python课程的订单,状态为购买成功。


    请你写出一个sql语句查询在2025-10-15以后,如果有一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程,那么输出这个用户的user_id,以及满足前面条件的第一次购买成功的C++课程或Java课程或Python课程的日期first_buy_date,以及购买成功的C++课程或Java课程或Python课程的次数cnt,并且输出结果按照user_id升序排序,以上例子查询结果如下:

    解析:

    id为4,6的订单满足以上条件,输出57,id为4的订单为第一次购买成功,输出first_buy_date为2025-10-23,总共成功购买了2次;

    id为5,7,8的订单满足以上条件,输出557336,id为5的订单为第一次购买成功,输出first_buy_date为2025-10-23,总共成功购买了3次;

    SELECT
    user_id,
    min(date) AS first_buy_date,
    COUNT(*) AS cnt
    FROM
    order_info
    WHERE
    date > '2025-10-15'
    AND
    product_name IN ('C++','Java','Python')
    AND
    status = 'completed'
    GROUP BY
    user_id
    HAVING
    COUNT(*) >= 2
    ORDER BY
    user_id ASC;
    

    SQL81 牛客的课程订单分析(五)

    描述

    有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里。

    有一个订单信息表(order_info),简况如下:

    第1行表示user_id为557336的用户在2025-10-10的时候使用了client_id为1的客户端下了C++课程的订单,但是状态为没有购买成功。

    第2行表示user_id为230173543的用户在2025-10-12的时候使用了client_id为2的客户端下了Python课程的订单,状态为购买成功。

    。。。

    最后1行表示user_id为557336的用户在2025-10-26的时候使用了client_id为1的客户端下了Python课程的订单,状态为购买成功。


    请你写出一个sql语句查询在2025-10-15以后,如果有一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程,那么输出这个用户的user_id,以及满足前面条件的第一次购买成功的C++课程或Java课程或Python课程的日期first_buy_date,以及满足前面条件的第二次购买成功的C++课程或Java课程或Python课程的日期second_buy_date,以及购买成功的C++课程或Java课程或Python课程的次数cnt,并且输出结果按照user_id升序排序,以上例子查询结果如下:

    解析:

    id为4,6的订单满足以上条件,输出57,id为4的订单为第一次购买成功,输出first_buy_date为2025-10-23,id为6的订单为第二次购买,输出second_buy_date为2025-10-24,总共成功购买了2次;

    id为5,7,8的订单满足以上条件,输出557336,id为5的订单为第一次购买成功,输出first_buy_date为2025-10-23,id为7的订单为第二次购买,输出second_buy_date为2025-10-25,总共成功购买了3次;

    SELECT
    user_id,
    MIN(CASE
    WHEN ranking = 1
    THEN date
    END) AS first_buy_date,
    MIN(CASE
    WHEN ranking = 2
    THEN date
    END) AS second_buy_date,
    cnt
    FROM
    (SELECT
    a1.user_id,
    a1.date,
    COUNT(*) OVER(PARTITION BY a1.user_id) AS cnt,
    RANK() OVER(PARTITION BY a1.user_id ORDER BY a1.date ASC) as ranking
    FROM
    order_info AS a1
    INNER JOIN
    (SELECT
    user_id
    FROM
    order_info
    WHERE
    date > '2021-10-15'
    AND
    product_name IN ('C++','Python','Java')
    AND
    status = 'completed'
    GROUP BY
    user_id
    HAVING
    COUNT(user_id) >= 2
    ORDER BY
    id) AS a2
    ON
    a1.user_id = a2.user_id
    WHERE
    a1.status = 'completed'
    AND
    a1.date >= '2025-10-15'
    AND
    a1.product_name IN ('C++','Python','Java')
    ORDER BY
    user_id,
    date) AS t
    GROUP BY
    user_id
    HAVING
    COUNT(user_id) >= 2
    ;
    

    SQL82 牛客的课程订单分析(六)

    描述

    有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里。

    有一个订单信息表(order_info),简况如下:

     

    第1行表示user_id为557336的用户在2025-10-10的时候使用了client_id为1的客户端下了C++课程的非拼团(is_group_buy为No)订单,但是状态为没有购买成功。

    第2行表示user_id为230173543的用户在2025-10-12的时候使用了client_id为2的客户端下了Python课程的非拼团(is_group_buy为No)订单,状态为购买成功。

    。。。

    最后1行表示user_id为557336的用户在2025-10-25的时候使用了下了C++课程的拼团(is_group_buy为Yes)订单,拼团不统计客户端,所以client_id所以为0,状态为购买成功。

    有一个客户端表(client),简况如下:

     

    请你写出一个sql语句查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程的订单id,是否拼团以及客户端名字信息,最后一列如果是非拼团订单,则显示对应客户端名字,如果是拼团订单,则显示NULL,并且按照order_info的id升序排序,以上例子查询结果如下:

     

    解析:

    id为4,6的订单满足以上条件,且因为4是通过IOS下单的非拼团订单,输出对应的信息,6是通过PC下单的非拼团订单,输出对应的信息以及客户端名字;

    id为5,7的订单满足以上条件,且因为5与7都是拼团订单,输出对应的信息以及NULL;

    按照id升序排序

    SELECT
    t1.id,
    t1.is_group_buy,
    t2.name AS client_name
    FROM
    (SELECT
    id,
    is_group_buy,
    client_id
    FROM
    order_info
    WHERE
    user_id IN 
    (SELECT
    user_id
    FROM
    order_info
    WHERE
    date > '2025-10-15'
    AND
    product_name IN ('C++','Java','Python')
    AND
    status = 'completed'
    GROUP BY
    user_id
    HAVING
    COUNT(user_id) >= 2
    ORDER BY
    user_id ASC)
    AND date > '2025-10-15'
    AND
    product_name IN ('C++','Java','Python')
    AND
    status = 'completed') AS t1
    LEFT JOIN
    (SELECT
    id,
    name
    FROM
    client
    ) AS t2
    ON 
    t1.client_id = t2.id;
    

    SQL83 牛客的课程订单分析(七)

    描述

    有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里。

    有一个订单信息表(order_info),简况如下:

     

    第1行表示user_id为557336的用户在2025-10-10的时候使用了client_id为1的客户端下了C++课程的非拼团(is_group_buyNo)订单,但是状态为没有购买成功。

    第2行表示user_id为230173543的用户在2025-10-12的时候使用了client_id为2的客户端下了Python课程的非拼团(is_group_buyNo)订单,状态为购买成功。

    。。。

    最后1行表示user_id为557336的用户在2025-10-25的时候使用了下了C++课程的拼团(is_group_buyYes)订单,拼团不统计客户端,所以client_id所以为0,状态为购买成功。

    有一个客户端表(client),简况如下:

     

    请你写出一个sql语句查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程的来源信息,第一列是显示的是客户端名字,如果是拼团订单则显示GroupBuy,第二列显示这个客户端(或者是拼团订单)有多少订单,最后结果按照第一列(source)升序排序,以上例子查询结果如下:

     

    解析:

    id为4,6的订单满足以上条件,且因为4是通过IOS下单的非拼团订单,则记: IOS 1

    ,6是通过PC下单的非拼团订单,则记: PC 1;

    id为5,7的订单满足以上条件,且因为5与7都是拼团订单,则记: GroupBuy 2;

    最后按照source升序排序。

    SELECT
    IF(a1.client_id = 0, 'GroupBuy', a3.name) AS source,
    COUNT(*) AS cnt
    FROM
    order_info AS a1
    INNER JOIN
    (SELECT
    user_id
    FROM
    order_info
    WHERE
    date > '2021-10-15'
    AND
    product_name IN ('C++','Python','Java')
    AND
    status = 'completed'
    GROUP BY
    user_id
    HAVING
    COUNT(user_id) >= 2
    ORDER BY
    id) AS a2
    ON
    a1.user_id = a2.user_id
    LEFT JOIN
    client AS a3
    ON
    a1.client_id = a3.id
    WHERE
    a1.status = 'completed'
    AND
    a1.date >= '2025-10-15'
    AND
    a1.product_name IN ('C++','Python','Java')
    GROUP BY 
    a1.client_id
    ORDER BY
    source
    ;
    

    SQL84 实习广场投递简历分析(一)

    描述

    在牛客实习广场有很多公司开放职位给同学们投递,同学投递完就会把简历信息存到数据库里。
    现在有简历信息表(resume_info),部分信息简况如下:

    第1行表示,在2025年1月2号,C++岗位收到了53封简历
    。。。
    最后1行表示,在2026年1月4号,Java岗位收到了230封简历

    请你写出SQL语句查询在2025年内投递简历的岗位和数量,并且按数量降序排序,以上例子查询结果如下:

    解题:
    SELECT
    job,
    cnt
    FROM
    (SELECT
    job,
    sum(num) AS cnt
    FROM
    resume_info
    WHERE
    YEAR(date) = '2025'
    GROUP BY
    job) AS t
    ORDER BY
    cnt DESC
    ;
    

    SQL85 实习广场投递简历分析(二)

    描述

    在牛客实习广场有很多公司开放职位给同学们投递,同学投递完就会把简历信息存到数据库里。
    现在有简历信息表(resume_info),部分信息简况如下:

    第1行表示,在2025年1月2号,C++岗位收到了53封简历
    。。。
    最后1行表示,在2026年2月6号,C++岗位收到了231封简历

    请你写出SQL语句查询在2025年内投递简历的每个岗位,每一个月内收到简历的数量,并且按先按月份降序排序,再按简历数目降序排序,以上例子查询结果如下:

    解题:
    SELECT
    job,
    month,
    SUM(num) AS cnt
    FROM
    (SELECT
    job,
    SUBSTR(date, 1, 7) AS month,
    num
    FROM
    resume_info
    WHERE
    YEAR(date) = '2025'
    ) AS t
    GROUP BY
    job, month
    ORDER BY
    month DESC,
    cnt DESC
    ;
    

    SQL86 实习广场投递简历分析(三)

    描述

    在牛客实习广场有很多公司开放职位给同学们投递,同学投递完就会把简历信息存到数据库里。
    现在有简历信息表(resume_info),部分信息简况如下:

    第1行表示,在2025年1月2号,C++岗位收到了53封简历
    。。。
    最后1行表示,在2027年2月6号,C++岗位收到了231封简历

    请你写出SQL语句查询在2025年投递简历的每个岗位,每一个月内收到简历的数目,和对应的2026年的同一个月同岗位,收到简历的数目,最后的结果先按first_year_mon月份降序,再按job降序排序显示,以上例子查询结果如下:

    解析:
    第1行表示Python岗位在2025年2月收到了93份简历,在对应的2026年2月收到了846份简历
    。。。
    最后1行表示C++岗位在2025年1月收到了107份简历,在对应的2026年1月收到了470份简历
    SELECT
    t1.job,
    t1.month,
    t1.cnt,
    t2.month,
    t2.cnt
    FROM
    (SELECT
    job,
    SUBSTR(date,1,7) AS month,
    sum(num) AS cnt
    FROM
    resume_info
    WHERE
    YEAR(date) = '2025'
    GROUP BY
    job, SUBSTR(date,1,7)
    ORDER BY
    SUBSTR(date,1,7) DESC,
    job DESC) AS t1
    LEFT JOIN
    (SELECT
    job,
    SUBSTR(date,1,7) AS month,
    sum(num) AS cnt
    FROM
    resume_info
    WHERE
    YEAR(date) = '2026'
    GROUP BY
    job, SUBSTR(date,1,7)
    ORDER BY
    SUBSTR(date,1,7) DESC,
    job DESC) AS t2
    ON
    t1.job = t2.job
    AND
    SUBSTR(t1.month,6,2) = SUBSTR(t2.month,6,2)
    ;
    

    SQL87 最差是第几名(一)

    描述

    TM小哥和FH小妹在牛客大学若干年后成立了牛客SQL班,班的每个人的综合成绩用A,B,C,D,E表示,90分以上都是A,80~90分都是B,60~70分为C,50~60为D,E为50分以下
    因为每个名次最多1个人,比如有2个A,那么必定有1个A是第1名,有1个A是第2名(综合成绩同分也会按照某一门的成绩分先后)。
    每次SQL考试完之后,老师会将班级成绩表展示给同学看。
    现在有班级成绩表(class_grade)如下:

    第1行表示成绩为A的学生有2个
    .......
    最后1行表示成绩为B的学生有2个

    请你写出一个SQL查询,如果一个学生知道了自己综合成绩以后,最差是排第几名? 结果按照grade升序排序,以上例子查询如下:
    解析:
    第1行表示,学生成绩为A的知道自己最差为第2名
    第2行表示,学生成绩为B的知道自己最差为第4名
    第3行表示,学生成绩为C的知道自己最差为第6名

    第4行表示,学生成绩为D的知道自己最差为第7名

    解题:

    SELECT

    grade,

    SUM(number) OVER(ORDER BY grade) AS t_rank

    FROM

    class_grade

    ;

    SQL88 最差是第几名(二)

    描述

    TM小哥和FH小妹在牛客大学若干年后成立了牛客SQL班,班的每个人的综合成绩用A,B,C,D,E表示,90分以上都是A,80~90分都是B,60~70分为C,50~60为D,E为50分以下
    因为每个名次最多1个人,比如有2个A,那么必定有1个A是第1名,有1个A是第2名(综合成绩同分也会按照某一门的成绩分先后)。
    每次SQL考试完之后,老师会将班级成绩表展示给同学看。
    现在有班级成绩表(class_grade)如下:

    第1行表示成绩为A的学生有2个
    .......
    最后1行表示成绩为D的学生有2个

    老师想知道学生们综合成绩的中位数是什么档位,请你写SQL帮忙查询一下,如果只有1个中位数,输出1个,如果有2个中位数,按grade升序输出,以上例子查询结果如下:
    解析:

    总体学生成绩排序如下:A, A, B, B, B, B, C, C, C, C, D, D,总共12个数,取中间的2个,取6,7为:B,C

    解题:

    方案一:构造一个区间

    SELECT
    grade
    FROM
    (SELECT
    t1.grade,
    t1.number,
    @my_num AS my_beg,
    @my_num := @my_num + number AS my_end
    FROM
    class_grade AS t1,
    (SELECT @my_num := 0) AS init
    ORDER BY
    t1.grade) AS t
    WHERE
    my_beg <= @my_num / 2 
    AND my_end >= @my_num / 2;
    ;
    

     方案二:正反排序来找中间

    SELECT
    t.grade
    FROM
    (SELECT
    grade,
    SUM(number) OVER(ORDER BY grade) AS situ1,
    SUM(number) OVER(ORDER BY grade DESC) AS situ2,
    SUM(number) OVER() AS total
    FROM
    class_grade
    ORDER BY
    grade) AS t
    WHERE
    t.situ1 >= t.total / 2
    AND
    t.situ2 >= t.total / 2;
    

    SQL89 获得积分最多的人(一)

    描述

    牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
    有一个用户表(user),简况如下:


    还有一个积分表(grade_info),简况如下:
    第1行表示,user_id为1的用户积分增加了3分。
    第2行表示,user_id为2的用户积分增加了3分。
    第3行表示,user_id为1的用户积分又增加了1分。
    .......
    最后1行表示,user_id为5的用户积分增加了3分。

    请你写一个SQL查找积分增加最高的用户的名字,以及他的总积分是多少(此题数据保证积分最高的用户有且只有1个),以上例子查询结果如下:
    解释:
    user_id为1的总计加了4分,其他的都是3分,user_id为1的name为tm
    输出tm|4
     
    解题:
    方案一:常规方法
    SELECT
    name,
    MAX(score)
    FROM
    (SELECT
    a1.name,
    SUM(a2.grade_num) AS score
    FROM
    user AS a1
    INNER JOIN
    grade_info AS a2
    ON
    a1.id = a2.user_id
    WHERE
    a2.type = 'add'
    GROUP BY
    a2.user_id
    ORDER BY
    score DESC
    LIMIT 1) AS t;
    

    方案二:窗口函数

    SELECT
    name,
    score AS grade_sum
    FROM
    (SELECT
    name,
    SUM(grade_num) OVER(PARTITION BY user_id) AS score
    FROM
    grade_info AS a2
    INNER JOIN
    user AS a1
    ON
    a1.id = a2.user_id
    WHERE
    a2.type = 'add') AS t
    ORDER BY score DESC
    LIMIT 1;
    

     SQL90 获得积分最多的人(二)

    描述

    牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
    有一个用户表(user),简况如下:


    还有一个积分表(grade_info),简况如下:
    第1行表示,user_id为1的用户积分增加了3分。
    第2行表示,user_id为2的用户积分增加了3分。
    第3行表示,user_id为1的用户积分又增加了1分。
    .......
    最后1行表示,user_id为3的用户积分增加了1分。

    请你写一个SQL查找积分增加最高的用户的id(可能有多个),名字,以及他的总积分是多少,查询结果按照id升序排序,以上例子查询结果如下:
    解释:

    user_id为1和3的2个人,积分都为4,都要输出

    解题:使用常规方法

    SELECT
    id,
    name,
    score
    FROM
    (SELECT
    a1.id,
    a1.name,
    SUM(a2.grade_num) AS score
    FROM
    user AS a1
    INNER JOIN
    grade_info AS a2
    ON
    a1.id = a2.user_id
    WHERE
    a2.type = 'add'
    GROUP BY
    a2.user_id) AS t
    WHERE
    score = 
    (SELECT
    MAX(score)
    FROM
    (SELECT
    a1.id,
    a1.name,
    SUM(a2.grade_num) AS score
    FROM
    user AS a1
    INNER JOIN
    grade_info AS a2
    ON
    a1.id = a2.user_id
    WHERE
    a2.type = 'add'
    GROUP BY
    a2.user_id) AS t1
    );
    

     SQL91 获得积分最多的人(三)

    描述

    牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
    有一个用户表(user),简况如下:


    还有一个积分表(grade_info),简况如下:

    第1行表示,user_id为1的用户积分增加了3分。
    第2行表示,user_id为2的用户积分增加了3分。
    第3行表示,user_id为1的用户积分减少了1分。
    .......
    最后1行表示,user_id为3的用户积分减少了1分。

    请你写一个SQL查找积分最高的用户的id,名字,以及他的总积分是多少(可能有多个),查询结果按照id升序排序,以上例子查询结果如下:

    解释:
    user_id为1和3的先加了3分,但是后面又减了1分,他们2个是2分,
    其他3个都是3分,所以输出其他三个的数据
    解题:使用常规方法
    SELECT
    id,
    name,
    score
    FROM
    (SELECT 
    t1.id,
    t1.name,
    COALESCE(t1.score_add, 0) - COALESCE(t2.score_reduce, 0) AS score
    FROM
    (SELECT
    a1.id,
    a1.name,
    SUM(a2.grade_num) AS score_add
    FROM
    user AS a1
    INNER JOIN
    grade_info AS a2
    ON
    a1.id = a2.user_id
    WHERE
    a2.type = 'add'
    GROUP BY
    a2.user_id) AS t1
    LEFT JOIN
    (SELECT
    b1.id,
    b1.name,
    SUM(b2.grade_num) AS score_reduce
    FROM
    user AS b1
    INNER JOIN
    grade_info AS b2
    ON
    b1.id = b2.user_id
    WHERE
    b2.type = 'reduce'
    GROUP BY
    b2.user_id) AS t2
    ON 
    t1.id = t2.id) AS t
    WHERE
    t.score = 
    (
    SELECT
    MAX(score)
    FROM
    (SELECT 
    t1.id,
    t1.name,
    COALESCE(t1.score_add, 0) - COALESCE(t2.score_reduce, 0) AS score
    FROM
    (SELECT
    a1.id,
    a1.name,
    SUM(a2.grade_num) AS score_add
    FROM
    user AS a1
    INNER JOIN
    grade_info AS a2
    ON
    a1.id = a2.user_id
    WHERE
    a2.type = 'add'
    GROUP BY
    a2.user_id) AS t1
    LEFT JOIN
    (SELECT
    b1.id,
    b1.name,
    SUM(b2.grade_num) AS score_reduce
    FROM
    user AS b1
    INNER JOIN
    grade_info AS b2
    ON
    b1.id = b2.user_id
    WHERE
    b2.type = 'reduce'
    GROUP BY
    b2.user_id) AS t2
    ON 
    t1.id = t2.id) AS t
    )
    ;
    

    晚安,迷茫的日子更应该鼓励自己。

    --------------------------------------------------

    更新完啦,和之前的联系起来了,一年时间进步了一点点,从之前解题大部分需要看解答到现在可以用第一感觉做出来,还不错。

    有收获,勉励一下自己,也勉励每一个努力的人,继续加油!

  • 相关阅读:
    Linux初学
    Linux初学
    EntityFramework IEnumerable,IQueryable ,Include
    EntityFramework 4/5/6 中执行自定义SQL语句
    ServiceStack Web Service 创建与调用简单示列
    ServiceStack 概念
    Couchbase 环境搭建与使用(C#)
    Redis 环境搭建与使用(C#)
    分享几段JavaScript
    Activemq 平台搭建与C#示列
  • 原文地址:https://www.cnblogs.com/zhuozige/p/15159257.html
Copyright © 2011-2022 走看看