select user_id,a.sc,min(created_at) tm
from (select user_id,max(score) sc from active_gamescore group by user_id) a
join active_gamescore b
on a.user_id=b.user_id and a.sc=b.score
group by a.user_id,a.sc
order by a.sc desc,tm asc limit 20;
Update: A person can only reply once, which is very sad. Thank you for taking the time to help me solve the problem. Tested it (average of 5 times)
In the case of 1w data volume, @clcx_1315: 0.004s @Iraq: 0.009s @邢爱明: 0.006s My own: 0.016s
Under the data volume of 20w: @clcx_1315: 0.104s @Iraq: 0.141s @邢爱明: 0.165s My own: 0.171s
So @clcx_1315’s method is the best. Thank you very much. I learned an idea. From the explanation, @clcx_1315's writing method only does 2 full table traversals, and the others are 3 times. Maybe this is the reason.
============================Previous divider================== ========== I thought about a writing method, but the efficiency needs to be improved
select ta.user_id,ta.max_score,tb.min_time
from (
select a.user_id, max(a.score) max_score from active_gamescore a where a.active_id='58' group by a.user_id
) ta
join (
select a.user_id,a.score,min(a.created_at) min_time from active_gamescore a where a.active_id='58' group by a.user_id,a.score
) tb
on ta.user_id=tb.user_id and ta.max_score=tb.score
order by ta.max_score desc,tb.min_time asc
limit 20
Assuming that the created_at field values under the same user are not repeated, you can try the following statement:
SELECT t1.user_id, t1.score, t1.created_at
FROM (
SELECT
@row_num:=IF(@prev_col1=t.user_id, @row_num+1, 1) AS row_number,
t.*,
@prev_col1:=t.user_id
FROM (SELECT * FROM active_gamescore ORDER BY user_id, score DESC, created_at) t,
(SELECT @row_num:=1, @prev_col1:=NULL) var
) t1 WHERE row_number = 1
ORDER BY t1.score DESC, t1.created_at
LIMIT 20
SELECT
yws0.user_id,
yws0.score,
min(create_time) AS create_time
FROM
active_gamescore yws0
WHERE
(user_id, score) IN (
SELECT
yws.user_id,
yws.max_score
FROM
(
SELECT
user_id,
max(score) AS max_score
FROM
active_gamescore
GROUP BY
user_id
) yws
)
GROUP BY
yws0.user_id,
yws0.score
ORDER BY
SCORE DESC
LIMIT 3
select t.userid,t.score from (select * from active_gamescore order by score desc,created desc) as t group by t.userid limit 20;
Update:
A person can only reply once, which is very sad.
Thank you for taking the time to help me solve the problem.
Tested it (average of 5 times)
In the case of 1w data volume,
@clcx_1315: 0.004s
@Iraq: 0.009s
@邢爱明: 0.006s
My own: 0.016s
Under the data volume of 20w:
@clcx_1315: 0.104s
@Iraq: 0.141s
@邢爱明: 0.165s
My own: 0.171s
So @clcx_1315’s method is the best. Thank you very much. I learned an idea.
From the explanation, @clcx_1315's writing method only does 2 full table traversals, and the others are 3 times. Maybe this is the reason.
============================Previous divider================== ==========
I thought about a writing method, but the efficiency needs to be improved
Assuming that the created_at field values under the same user are not repeated, you can try the following statement: