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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...