假设最初我有这样的表而没有排名,或者如果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 |
排名系统应按顺序选择“通过”>“失败”>“酒吧”。但是在该类别中,当开始输入新类别时,排名系统将从上一个开始计数。
预期结果:
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工作/天中使用
最佳答案
您可以使用用户变量来设置排名,使用针对要更新的表联接的子查询可以更新表中的排名。
像这样的东西:
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允许您按指定的顺序进行排序。
关于php - PHP MySQL排名将按数字顺序排列,并按组排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40906915/