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

 

 

晚安,迷茫的日子更應該鼓勵自己。

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

更新完啦,和之前的聯系起來了,一年時間進步了一點點,從之前解題大部分需要看解答到現在可以用第一感覺做出來,還不錯。

有收獲,勉勵一下自己,也勉勵每一個努力的人,繼續加油!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM