php – 将等级列表存储在mysql表中

让这个表(rank_list).

+--------+--------+--------+--------+
|  Sub   |  Name  |  Rank  | Marks  |
+--------+--------+--------+--------+
|Math2   |Smith   |       1|      85|
|Math1   |John    |       1|      92|
|Math1   |Susan   |       2|      91|
|Math1   |Abc     |       3|    90.5|
+--------+--------+--------+--------+

现在我还有四个结果.我必须插入这些给他们正确的排名.我也不接受排名超过3的结果.

Sub = Math2,    Name = Mile,  Marks = 86
Sub = Math1,    Name = Luna,  Marks = 92.5
Sub = Physics1, Name = Sakib, Marks = 88.75
Sub = Math1,    Name = Coolb, Marks = 65

由于Mile有一个排名为2的标记,他将被插入Rank 2.

Luna有最高分,她将获得等级1,Abc将被删除(是的,删除).

Sakib来自Physics1,因此他将直接插入,因为他目前在物理学中排名第一.

不会插入Coolb,因为他不在前3名.

我想要MySQL查询来做到这一点.

我可以使用PHP来做到这一点,但这需要很长时间.所以,我想使用SQL(更快的插入和删除)来做到这一点.我需要你的帮助.提前致谢.

最佳答案 这是
How to perform grouped ranking in MySQL的一个无耻偷窃的例子

你的数据库设计并不适合它,但它确实有效,在你达到很多行之前它不会变慢,如果你觉得它太慢了,你总是可以使用一个触发器并创建一种“物化观点“与目前的排名.

小提琴测试:http://sqlfiddle.com/#!2/b2cd8/15

基于您的表的SQL:

SELECT Name, Sub, Marks, Rank
FROM
    (SELECT Name, Sub, Marks,
        @student:=CASE WHEN @last_sub <> Sub THEN 1 ELSE @student+1 END AS Rank,
        @last_sub:=Sub
    FROM
        (SELECT @student:= 0) AS s,
        (SELECT @class:= 0) AS c,
        (SELECT * 
            FROM rank_list
            ORDER BY Sub, Marks DESC
        ) AS temp
    ) AS temp2
WHERE Rank <= 3
点赞