4

让我们拥有这张桌子(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 的标记,他将被插入为Rank2。

Luna 有最高分,她会得到Rank1 并且Abc将被删除(是的,已删除)。

Sakib来自Physics1,所以他将直接插入,因为他目前在物理中排名第一。

Coolb 不会被插入,因为他不在前三名。

我希望 MySQL 查询来做到这一点。

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

4

1 回答 1

2

这是如何在 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
于 2013-02-24T12:09:51.850 回答