如何在不使用排名功能的情况下更新表格中的分数
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 - 如何在不更改页面和更新视图的情况下提交表单?