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