如何在不使用排名功能的情况下更新表格中的分数

Posted

技术标签:

【中文标题】如何在不使用排名功能的情况下更新表格中的分数【英文标题】:How do I update scores in table without using a ranking function 【发布时间】:2021-01-18 09:23:07 【问题描述】:

表名是:结果

ID  Name   score    position
1   John    40        0
2.  Ali     79        0
3   Ben     50        0
4   Joe     79        0

如何在不使用 rank() 的情况下更新表格结果以提供下表,因为服务器不支持它。请有人帮助我解决如下表所示的关系的 mysql 代码。

ID  Name  score   position
1   John   40        4
2.  Ali    79        1
3   Ben    50        3
4   Joe    79        1

【问题讨论】:

为什么不想使用排名功能? 【参考方案1】:

在版本 8 之前的 MySQL 中尝试使用多表更新语法:

UPDATE scores t
  LEFT JOIN (
    SELECT t1.id, COUNT(*) + 1 AS new_position
    FROM scores t1
    JOIN scores t2 ON t1.score < t2.score 
    GROUP BY t1.id
  ) agg ON t.id = agg.id
SET t.position = COALESCE(agg.new_position, 1)

fiddle

【讨论】:

更新的左连接是一件奇怪的事情 @Strawberry,否则会出现零位。用内连接替换小提琴中的左连接,你会看到。 当然,但是两次更新可能会更快;首先将所有 0 值设置为 1,然后使用内部连接运行您的值。【参考方案2】:

有很多方法可以剥这种特殊动物的皮。怎么样...

 DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(ID SERIAL PRIMARY KEY
,Name   VARCHAR(12) NOT NULL 
,score  INT NOT NULL
);

INSERT INTO my_table VALUES
(1,'John',40),
(2,'Ali',79),
(3,'Ben',50),
(4,'Joe',79);
  
  SELECT id
       , name
       , score
       , FIND_IN_SET(score, scores) rank
    FROM my_table
   CROSS 
    JOIN 
       ( SELECT GROUP_CONCAT(score ORDER BY score DESC) scores
           FROM my_table
       ) scores
       
+----+------+-------+------+
| id | name | score | rank |
+----+------+-------+------+
|  1 | John |    40 |    4 |
|  2 | Ali  |    79 |    1 |
|  3 | Ben  |    50 |    3 |
|  4 | Joe  |    79 |    1 |
+----+------+-------+------+

我没有提供更新,因为您通常不会存储派生数据。

【讨论】:

非常感谢【参考方案3】:

您可以按如下方式使用相关子查询:

update your_table t
  set t.position = (select count(*) + 1 from your_table tt
                     where tt.score > t.score)

【讨论】:

非常感谢

以上是关于如何在不使用排名功能的情况下更新表格中的分数的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 如何在不更改页面和更新视图的情况下提交表单?

蜂巢:如何在不更新的情况下处理 scd 类型 2

如何在不加载视图的情况下重新加载/刷新部分视图中的级联下拉列表

如何在不更新表单中所有字段的情况下进行更新

如何在不退出的情况下更新会话值?

如何在不使用边框间距和空行的情况下在带有边框的表格行之间添加空格