【问题标题】:Store a ranklist in a mysql table将排名列表存储在 mysql 表中
【发布时间】:2013-02-09 15:18:56
【问题描述】:

让我们拥有这张桌子(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 来做这个(为了更快的插入和删除)。我需要你的帮助。提前致谢。

【问题讨论】:

  • 更好的方法可能是将原始数据插入到一个表中,并使用视图来表示每个主题中排名靠前的。
  • 我同意@IanMcMahon。存储所有记录,然后在需要时提取所需的内容。
  • 领带应该怎么做?
  • @ypercube- 没有,不会被插入
  • 请澄清您回复@ypercube 的“不会被插入”位。如果有两个新的Math1 行具有相同的Marks91,即使它们中的每一个都大于排名第三的Abc,您是否愿意忽略这两个行?或者您只想丢弃一个?在这种情况下,自然的问题是“哪个?”。

标签: php mysql sql phpmyadmin


【解决方案1】:

这是一个来自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

【讨论】:

  • 我不想要排名。相反,如果它在排名列表中占有一席之地,我想插入一行。如果新行不适合排名列表,则不会插入。你所展示的是从表格中获取排名列表
  • 是的,我意识到这一点。这只是我认为应该如何做的一个例子。而不是你想要在这里实现的目标。为了能够按照自己的方式进行操作,您必须检查特定 Sub 是否有
猜你喜欢
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
相关资源
最近更新 更多