【问题标题】:mySQL updating but also not updatingmySQL 更新但也不更新
【发布时间】:2011-01-04 19:06:30
【问题描述】:

我正在用 mySQL/PHP 编写,但是遇到这个问题我无法理解。这个 PHP 脚本包含两个 SQL 语句。我要做的是更新一个运动联赛表(一个名为 tblrank 的 SQL 表,其中包含许多联赛表,由 TableID 分隔),并指示自上次更新以来球队是上升还是下降。第一段代码有点笨拙,可能写得更好(我可以在 MSSQL 中用大约 6 行代码完成),它的工作原理是计算排名低于它的团队数量,然后添加一个。它似乎工作......有点,我稍后会解释。

update tblrank AS r
        set Rank = 1 + (select count(*) from 
                             (select r2.teamID
                              from tblrank r2
                                   inner join tblrank r3
                              where r3.TableID = r2.TableID and r3.TableID = $tableid
                              and (r3.Points > r2.Points
                                  or (r3.Points = r2.Points and r3.TieBreaker > r2.TieBreaker))) as duh
                        where duh.teamID = r.teamID 
                        and duh.TableID = r.TableID 
                        and r.TableID = $tableid

然后,运行这段代码来选择要显示的图像。

update tblrank
set image = case when Rank < LastRank then 'up.png'
        when Rank > LastRank then 'down.png'
        else 'nomove.png' end
where TableID = $tableid

现在如果我为 $tableid = 1 运行它,它工作得很好。但是,如果我为 $tableid = 2 运行它,那么整个 tblRank 中的所有排名都设置为 1。(在为 $tableid = 2 运行它之前,所有排名都是 1,除了 TableID =1 的记录)。这显然不是我想要的。

这两个语句都在 if(mysql_query($sql)) 条件内,所以我可以验证它们是否已执行。

我使用 MS SQL 比使用 mySQL 更多,所以我不是专家 - 任何人都可以帮助我解决这个问题,因为我很困惑!我检查了这两个代码块都执行了。两者之间没有执行其他 SQL。

【问题讨论】:

    标签: mysql ranking


    【解决方案1】:

    这就是我的做法。首先将所有Rank 值初始化为零。

    UPDATE tblrank SET Rank = 0;
    
    UPDATE tblrank r1 JOIN tblrank r2 ON r1.TableID = r2.TableID
    SET r1.Rank = r1.Rank + 1
    WHERE r1.Points > r2.Points 
      OR (r1.Points = r2.Points AND r1.TieBreaker > r2.TieBreaker)
    

    联接自然地将每一行 r1 与具有相同表和团队且分数较低的行集 r2 匹配。然后它为每个匹配的行将Rank 增加 1。

    【讨论】:

    • 我认为这可能与您需要的相反,因为排名较高的团队最终会获得更大的 Rank 值。
    • 我不希望 r1 通过 TeamID 匹配 r2,但是,我希望它找到其他团队?然而,这看起来确实比我的方法简单得多。我以前从未见过 JOIN -> USING 语法,在 MS SQL 中不存在。我会阅读它:)
    • 哦,对,有道理。 :) 我编辑了上面的代码以使用熟悉的ON 语法,并删除了TeamIDUSING 语法只是命名列的相等比较,假设列在两个表中以相同的名称存在。
    【解决方案2】:

    好吧,我已经修复了它,我不确定出了什么问题,但是我已经拆分了更新语句,首先创建并填充了一个名为 rankcount 的临时表。我这样做是为了更容易看到发生了什么。

    create temporary table rankcount (TableID int, UserID int)");
       insert into rankcount (TableID, UserID)
                select r2.TableID, r2.UserID
                    from tblRank r2
                                    inner join tblRank r3
                where r3.TableID = r2.TableID and r3.TableID = $tableid
                and (r3.Points > r2.Points
                       or (r3.Points = r2.Points and r3.TieBreakerOne > r2.TieBreakerOne))
    

    然后这个工作......

    update userEntryTableRank r
            set Rank = 1 + (select count(*) from rankcount rc
                            where rc.UserID = r.UserID and rc.TableID = r.TableID)
            where r.TableID = $tableid
    

    :)

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 1970-01-01
      • 2021-06-18
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 2016-06-15
      • 2013-03-08
      相关资源
      最近更新 更多