PHP MySQL排名将按数量排序并按组排序

时间:2016-12-01 09:32:05

标签: php mysql

让我们说最初我有没有排名这样的表,或者如果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中使用

1 个答案:

答案 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允许您按指定顺序排序。