项
以下工作:
UPDATE names
JOIN (SELECT * FROM names ORDER BY placeRef, incidence DESC) AS p ON p.id = names.id,
(SELECT @curRank := 0, @nextRank := 0, @prevInc := 9999999999, @prevPlace := 0) AS v
SET
names.rank = IF( @prevPlace != p.placeRef, @curRank := 0, 0),
names.rank = IF( @prevPlace != p.placeRef, @nextRank := 0, 0),
names.rank = IF( @prevInc = p.incidence, @nextRank := @nextRank + 1, @curRank := @nextRank := @nextRank + 1),
names.rank = IF( @prevInc = p.incidence, @curRank := @curRank, @curRank := @nextRank),
names.incidence = @prevInc := names.incidence,
names.placeRef = @prevPlace := names.placeRef;
说明:
UPDATE names
1 - 设置表进行更新
JOIN (SELECT * FROM names ORDER BY placeRef, incidence DESC) AS p ON p.id = names.id,
2 - 这使得有结果的虚拟表排序的,所以该排名可以应用
(SELECT @curRank := 0, @nextRank := 0, @prevInc := 9999999999, @prevPlace := 0) AS v
3 - 这将一些变量将被用来告诉何时incrament并重置排名
names.rank = IF( @prevPlace != p.placeRef, @curRank := 0, 0),
4 - 这是当前等级重置为0黑客攻击时的MySQL迭代到一个新的地方
names.rank = IF( @prevPlace != p.placeRef, @nextRank := 0, 0),
5 - 这是下一个等级重置为0黑客攻击时的MySQL迭代到一个新的地方
names.rank = IF( @prevInc = p.incidence, @nextRank := @nextRank + 1, @curRank := @nextRank := @nextRank + 1),
6 - 这是一个更新下一个和真正水流黑客攻击在当前发病率是一样的前面发生
names.rank = IF( @prevInc = p.incidence, @curRank := @curRank, @curRank := @nextRank),
7 NT行列 - 设置职级相同,最后的排名时,其发病率是一样的前面,或者如果它不是递增等级”牛逼
names.incidence = @prevInc := names.incidence,
8 - 这是设置一个变量包含先前发生黑客攻击,因此,我们可以告诉在未来itteration
names.placeRef = @prevPlace := names.placeRef;
9做的 - 这是一个黑客ŧ帽子设置一个变量来包含以前的地方,所以我们可以告诉下一步做什么
您的SQL语句在哪里? – Raptor 2014-12-19 02:35:03
花了一段时间对我进行注释。 – 2014-12-19 02:44:53