2

我正在用 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。

4

2 回答 2

0

这就是我的做法。首先将所有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。

于 2010-01-14T02:00:40.617 回答
0

好吧,我已经修复了它,我不确定出了什么问题,但是我已经拆分了更新语句,首先创建并填充了一个名为 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

:)

于 2010-01-13T22:37:43.377 回答