首頁 > 軟體

mysql如何取分組之後最新的資料

2022-06-08 22:03:01

一、資料表設計

二、查詢場景 

統計每門課的考試次數、最新一次考試的時間、最新一次考試的錄入成績的老師

1、統計沒門課的考試次數

#考試次數統計
select project '科目',count(project) '考試次數' from score a group by project

查詢結果:

 2、最新一次考試的時間

#考試次數統計	最新一次考試的時間
select project '科目',count(project) '考試次數' ,max(create_time) from score a group by project

查詢結果:

 

 3、分組統計最新的錄入成績的老師

當我們分組去查詢最新的錄入成績的老師或者分組查詢最新一次各科的成績時確發現資料不是最新的。

SELECT
	a.id,
	a.edit_teacher,
	a.project,
	a.create_time,
	a.score, 
	count(project) '考試次數',
	max(create_time) '最新資料時間'
FROM
	score a 
GROUP BY
	a.project

查詢結果:

但是很顯然我們需要查詢的資料id應該是4、8、12

 可以看出分組聚合的時候預設查詢的是分組之後的第一條資料,那麼我們想要查詢最新的資料需要新對我們的資料進行排序

SELECT
	*,
	count( project ) '考試次數',
	max(create_time) '最新資料時間' 
FROM
	(
SELECT
	a.id,
	a.edit_teacher,
	a.project,
	a.create_time,
	a.score 
FROM
	score a 
ORDER BY
	a.id DESC 
	) b 
GROUP BY
	b.project

查詢結果:

我們發現資料並不是我們想要的結果,子查詢裡面的排序失效了

網上查詢各種資料發現

子查詢生成的臨時表(派生表derived table)中使用order by且使其生效,必須滿足三個條件:

1、外部查詢禁止分組或者聚合

2、外部查詢未指定having,HAVING, order by

3、外部查詢將派生表或者檢視作為from句中唯一指定源

顯然我們沒有滿足,那麼如何解決order by失效呢?

我們外部表使用了group by,那麼臨時表將不會執行filesort操作(即order by會被忽略),所以我們可以在臨時表中加上(distinct(a.id))。

SELECT
	*,
	count( project ) '考試次數' ,
	max(create_time) '最新資料時間' 
FROM
	(
SELECT DISTINCT
	a.id,
	a.edit_teacher,
	a.project,
	a.create_time,
	a.score 
FROM
	score a 
ORDER BY
	a.id DESC 
	) b 
GROUP BY
	b.project

執行結果:

 結果正確。

總結

到此這篇關於mysql如何取分組之後最新的資料的文章就介紹到這了,更多相關mysql取分組最新資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com