2010-01-13 146 views
2

我写在mySQL/PHP,但有这个问题,我不能让我的头。这一个PHP脚本包含两个SQL语句。我想要做的是更新一个运动联盟表(一个名为tblrank的SQL表 - 它包含许多联赛表,由TableID分隔),并且指示自上次更新以来球队是否上涨或下跌。这第一个代码有点笨重,可能写得更好(我可以在MSSQL中做大约6行代码),它的工作原理是计算排名比它低的团队的数量,然后再添加一个。它似乎工作......就像我稍后将解释的那样。mySQL更新,但也没有更新

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

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

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

回答

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 

:)

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

+0

我认为这可能与您需要的相反,因为排名较高的团队最终会得到较大的Rank值。 – 2010-01-14 02:04:06

+0

我不想让r1通过TeamID与r2匹配,但是,我希望它找到其他团队?然而,这看起来比我的方法简单得多。我从来没有见过JOIN - > USING之前的语法,在MS SQL中不存在。我会读它:) – reedstonefood 2010-01-14 13:24:04

+0

哦,对,这是有道理的。 :)我编辑了上面的代码来使用熟悉的'ON'语法,并删除了'TeamID'。 'USING'语法只是名称列的相等比较,假定列在两个表中都以相同名称存在。 – 2010-01-14 15:43:34