首页 > 解决方案 > 根据排名更新 SQL 数据库列

问题描述

我正在开发一个程序,其中一个方面是根据每个玩家的 ELO 分数对他们进行排名。我已经能够创建一个可以提供排名作为输出的 SQL 查询,但我无法弄清楚如何让它真正更新数据库表。我目前正在使用 SQLite

当前数据库表

当前代码:

SELECT
  name,
  elo,
  losses,
  matches,
  RANK() OVER(ORDER BY elo DESC)

FROM membersData 

{ 更新后的理想数据库] 2

任何帮助将不胜感激

标签: sqldatabasesqlite

解决方案


假设名字是unique,这样我们就可以加入

 UPDATE membersData m1
 INNER JOIN (
 SELECT
  name,
  RANK() OVER(ORDER BY elo DESC) newrank FROM membersData) m2 ON m1.name = m2.name

SET m1.rank = m2.newrank

架构(SQLite v3.30)

CREATE TABLE membersData(
    name    TEXT   ,
    elo     DOUBLE,
    wins    INTEGER,
    losses  INTEGER,
    matches INTEGER,
    ranking INTEGER
);

INSERT INTO membersData (
                            ranking,
                            matches,
                            losses,
                            wins,
                            elo,
                            name
                        )
                        VALUES (
                            NULL,
                            4,
                            3,
                            1,
                            123123,
                            'James'
                        ),
                        (
                            NULL,
                            5,
                            4,
                            1,
                            123,
                            'Top'
                        ),
                        (
                            NULL,
                            5,
                            2,
                            3,
                            1000,
                            'harry'
                        ),
                        (
                            NULL,
                            5,
                            0,
                            5,
                            450,
                            'kai'
                        );

查询 #1

UPDATE membersData 
SET ranking = (SELECT COUNT(*) + 1
                   FROM membersData md2
                   WHERE md2.elo > membersData.elo
                  );

没有要显示的结果。


查询 #2

SELECT * FROM membersData ORDEr BY ranking;
姓名 埃洛 获胜 损失 火柴 排行
詹姆士 123123 1 3 4 1
哈利 1000 3 2 5 2
450 5 0 5 3
最佳 123 1 4 5 4

在 DB Fiddle 上查看


推荐阅读