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
)
;

 

 

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

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

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

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

posted on 2021-08-18 22:43  桌子哥  阅读(354)  评论(0编辑  收藏  举报