让我们说最初我有没有排名这样的表,或者如果php代码已经运行
已经有排名ID | STATUS | GRADE | RANK
1 | FAIL | 99 |
2 | FAIL | 95 |
3 | PASS | 40 |
4 | BAR | 99 |
5 | PASS | 70 |
6 | PASS | 85 |
7 | BAR | 80 |
8 | FAIL | 60 |
9 | BAR | 50 |
排名系统应选择PASS>失败> BAR按顺序排列。但在该类别中,当开始输入新类别时,排名系统将从之前的数量开始计算。
预期结果:
ID | STATUS | GRADE | RANK
1 | FAIL | 99 | 4
2 | FAIL | 95 | 5
3 | PASS | 40 | 3
4 | BAR | 99 |
5 | PASS | 70 | 2
6 | PASS | 85 | 1
7 | BAR | 80 |
8 | FAIL | 60 | 6
9 | BAR | 50 |
另外,如果可以告诉我一些编辑代码的技术,那么在另一天如果我打算将编码升级到
ID | STATUS | GRADE | RANK
1 | FAIL | 99 | 4
2 | FAIL | 95 | 5
3 | PASS | 40 | 3
4 | BAR | 99 | 7
5 | PASS | 70 | 2
6 | PASS | 85 | 1
7 | BAR | 80 | 8
8 | FAIL | 60 | 6
9 | BAR | 50 | 9
我尝试编辑和学习我在这里找到的一些代码,但我不熟悉会话变量。此代码将在cron job / day中使用
答案 0 :(得分:0)
您可以使用用户变量来设置排名,并使用针对您要更新的表加入的子查询,您可以更新表中的排名。
这样的事情: -
UPDATE sometable
INNER JOIN
(
SELECT id,
`status`,
grade,
@rank:=@rank + 1 AS rank
FROM
(
SELECT id,
`status`,
grade
FROM sometable
ORDER BY FIELD(`status`, 'PASS', 'FAIL', 'BAR'), Grade DESC
) sub0
CROSS JOIN (SELECT @rank:=0) sub1
) sub2
ON sometable.id = sub2.id
SET sometable.rank = sub2.rank
请注意,我已使用FIELD函数按状态排序。在这种情况下,它并不是绝对必要的(因为您可以通过状态DESC进行排序)但是由于状态名称通常不会出现在有意义的字母顺序中,因此FIELD允许您按指定顺序排序。