假设最初我有这样的表而没有排名,或者如果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/

10-11 15:25
查看更多