php - 将排名表存储在 mysql 表中

标签 php mysql sql phpmyadmin

让这个表(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 的分数最高,她将获得 Rank 1 并且 Abc 将被删除(是的,已删除)。

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

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

我希望 MySQL 查询来执行此操作。

我可以使用 PHP 来完成此操作,但这会花费很多时间。所以,我想使用 SQL 来执行此操作(以便更快地插入和删除)。我需要你的帮助。提前致谢。

最佳答案

这是来自 How to perform grouped ranking in MySQL 的无耻盗用示例

您的数据库设计不太适合它,但它确实可以工作,并且在您达到非常高的行数之前它不会变慢,如果您觉得它太慢,您总是可以使用触发器并创建一个一种具有当前排名的“物化 View ”。

测试 fiddle :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

关于php - 将排名表存储在 mysql 表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15050731/

相关文章:

php - 外部启动 PHP 脚本的 MYSQL 触发器

mysql - 如何在mysql中使用空白值创建唯一键?

javascript - 如何(SELECT *)node.js 中的两个 mysql 表(express)

mysql - 如何简化多重强制转换 MySql select 语句?

在 Ubuntu 16.04 LTS 上设置 LAMP 后,PHP 无法看到正在上传的文件

php zend framework 日志 mysql 查询

javascript - 如何使用 javascript 生成输入类型下拉列表?

mysql - 在 MySQL 中使用 SELECT ... FOR UPDATE 死锁

sql - ORDER BY 仅适用于列别名

mysql - 外键约束失败