让这个表(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