MySQL(1)------group by 分組 取最大值
阿新 • • 發佈:2019-01-25
首先表結構
create table sysstudentlibrarypool
(
id int auto_increment primary key,
score int null,
time varchar(255) null,
count int null,
classify int null,
stuId int null,
lpId int null,
)
- id為主鍵
- score是分數
- time是時間 (yyyy-MM-dd)
- count是次數
- classify是類別
- stuId是個外來鍵指向學生表的學生id
- lpId是個外來鍵指向關卡id
這張表用於儲存學生每次完成關卡的分數
需求就是取每個學生在指定關卡的最大分數
加粗的就是與需求有關的欄位
先排序後分組
select *
from (
select *
from sysstudentlibrarypool
order by score desc
) t
group by stuId
先根據分數排序,再根據 stuId 和 lpId 分組。
看這個邏輯貌似是很有道理
但執行了之後卻好像並沒有達到我所要的需求
雖然 學生與關卡分組了但是,並沒有取到最大做題分數啊!
加個max()
select
id,
max(score) as score,
time,
count,
classify,
stuId,
lpId
from (
select *
from sysstudentlibrarypool
order by score desc
) t
group by stuId, lpId
額,的確是顯示了最大的分數了,但是好像記錄是對不上的
只顯示了最大的分數其他的欄位並不是對應分數的
實現思路
唉,找不到靠譜的輪子只能自己上了
select
id,
max(score) as score,
time,
count,
classify,
stuId,
lpId
from sysstudentlibrarypool
where 1 = 1 and stuId in (select distinct (stuId)
from sysstudentlibrarypool
where 1 = 1)
group by lpId, stuId
order by score desc;
主要實現思路:
1. 子查詢中取 學生id(有條件時取單個,沒有條件時取所有的學生id)
2. 根據關卡 學生id 分組,然後進行分數排序(取分數最大的),也可以新增各種條件(指定關卡,指定時間戳等)
3. 就能查詢每關的每個學生的最大分數
這樣每個where 1 = 1後面都能加上查詢條件了。
積累
-
1.
group by
order by
這裡的排序是對分組後的資料排序
2. 突然有點明白group by的作用了
對指定的欄位進行分組,然後根據需求顯示,想要的欄位,比如每組中max(某欄位)
不知道怎麼的以前總理解為 分組並顯示每組中所有記錄。。。。。
這裡只是提供一下自己的思路,也請大神給出更好的實現,相互學習,謝謝。