oracle 中有一个名为 rank() 和 dense_rank() 的分析函数,它们对获取结果很有用。
当您使用 mysql 时,我尝试将这些函数转换为 mysql 等效项。
您可以使用以下查询获得所需的结果,您可以使用它来更新用户表。如果在成绩上也有相同的逻辑,您可能需要进一步更改它。
set @pk1 ='';
set @rn1 =1;
set @tot ='';
set @val =1;
SELECT id,
name,
phase,
phasetotal,
denseRank
FROM
(
SELECT id,
name,
phase,
phasetotal,
@rn1 := if(@pk1=phase, @rn1+@val,1) as denseRank,
@val := if(@pk1=phase, if(@tot=phasetotal, @val+1, 1),1) as value,
@pk1 := phase,
@tot := phasetotal
FROM
(
select users.id,users.name, points.phase, sum(points.points)
as phasetotal from users,points where users.id = points.userid
group by users.id, points.phase order by points.phase, phasetotal desc, points.grade1 desc, points.grade2 desc
) A
) B;
这里是更新查询
set @pk1 ='';
set @rn1 =1;
set @tot ='';
set @val =1;
UPDATE users u join (
SELECT id,
name,
phase,
phasetotal,
denseRank
FROM
(
SELECT id,
name,
phase,
phasetotal,
@rn1 := if(@pk1=phase, @rn1+@val,1) as denseRank,
@val := if(@pk1=phase, if(@tot=phasetotal, @val+1, 1),1) as value,
@pk1 := phase,
@tot := phasetotal
FROM
(
select users.id,users.name, points.phase, sum(points.points)
as phasetotal from users,points where users.id = points.userid
group by users.id, points.phase order by points.phase, phasetotal desc, points.grade1 desc, points.grade2 desc
) A
) B ) C on u.id = C.id
SET u.phase1 = CASE WHEN C.phase = 1 and u.phase1 = 0 THEN C.denseRank ELSE u.phase1 END,
u.phase2 = CASE WHEN C.phase = 2 and u.phase2 = 0 THEN C.denseRank ELSE u.phase2 END;