【问题标题】:Updating SQL database column based on rank根据排名更新 SQL 数据库列
【发布时间】:2021-05-13 09:43:49
【问题描述】:

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

当前代码:

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

FROM membersData 

{]2

任何帮助将不胜感激

【问题讨论】:

  • 请考虑进行此更新,因为您计算的排名是派生数据。
  • 为什么 450 的排名高于 123 的排名?
  • 那是我的错误450应该是3,而123是4

标签: sql database sqlite


【解决方案1】:

假设名字是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;
name elo wins losses matches ranking
James 123123 1 3 4 1
harry 1000 3 2 5 2
kai 450 5 0 5 3
Top 123 1 4 5 4

View on DB Fiddle

【讨论】:

  • 我是 sql 新手,执行此操作时我明白了。 [18:09:17] 在数据库“chessClub”上执行 SQL 查询时出错:“m1”附近:语法错误。名字也是独一无二的
  • 您的代码中可能有错误,请制作一个 dbfiddle,以便我检查。您已更改代码。
  • db-fiddle.com/f/cW2X3hWFnGzfnKto4BgVnK/0 。它适用于 sqlite 吗?
  • @ArkieMandziy mysql 5.7 没有排名,只有 mysql 8.0 有它,你也将你的问题标记为 sql lite,所以我编辑了我的答案以满足你的要求
  • 你是一个传奇的伙伴,我非常感激。
【解决方案2】:

一种方法是UPDATE 中的相关子查询:

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

【讨论】:

  • @ArkieMandziy 。 . .为什么不呢?
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多