mySQL更新但也没有更新

时间:2010-01-13 19:19:34

标签: mysql ranking

我正在用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中的所有Ranks都设置为1.(在为$ tableid = 2运行它之前,所有等级都是1,除了TableID = 1的记录)。这显然不是我想要的。

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

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

2 个答案:

答案 0 :(得分: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

:)

答案 1 :(得分: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。