2014-02-07 39 views
0

我正在处理php/MySql中的一些代码,我需要根据分数值更新一个名为scorerank的字段。我发现这里以前的疑问,解决了我一直在寻找:修改一个mysql表来显示基于列值的排名

Update the rank in a MySQL Table

我修改了他们的榜样和我的数据库工作。我还添加了一个条件,以便我只修改具有特定锦标赛和桌面的列。我曾经在内部唯一索引变量加入到ID更新哪一行 - 我想我做的对,但我得到了以下错误:

1248 - 每一个派生表必须有它自己的别名

这里的我的代码。任何人都可以发现错误吗?

UPDATE tscores 
JOIN  (SELECT p.userid,p.scoreid, 
        IF(@lastPoint <> p.score, 
         @curRank := @curRank + 1, 
         @curRank) AS rank, 
        IF(@lastPoint = p.score, 
         @curRank := @curRank + 1, 
         @curRank), 
        @lastPoint := p.score 
      FROM  tscores p 
      WHERE  (p.tourneyid=1 and p.tableid=2) 
      JOIN  (SELECT @curRank := 0, @lastPoint := 0) 
      ORDER BY p.score DESC 

     ) ranks ON (ranks.userid = tscores.userid) 
SET  tscores.scorerank = ranks.scorerank 
WHERE tscores.scoreid = p.scoreid 

这里是我的工作表:

CREATE TABLE IF NOT EXISTS `tscores` (
    `scoreid` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `tourneyid` int(10) unsigned NOT NULL, 
    `tableid` int(10) unsigned NOT NULL, 
    `userid` int(10) unsigned NOT NULL, 
    `score` int(16) unsigned NOT NULL DEFAULT '0', 
    `scorestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `scoreround` int(3) unsigned NOT NULL DEFAULT '0', 
    `scoregroup` int(3) unsigned NOT NULL DEFAULT '0', 
    `scorerank` int(4) unsigned DEFAULT NULL, 
    PRIMARY KEY (`scoreid`), 
    KEY `tourneyid` (`tourneyid`,`tableid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=62 ; 

回答

0

在你的,你要使用的别名是一个子查询中最后一行.. 见下文

WHERE tscores.scoreid = ranks.scoreid 
修复
+0

我仍然得到与此相同的错误: UPDATE tscores ... SET tscores.scorerank = ranks.scorerank WHERE tscores.scoreid = ranks.scoreid –

+0

有一些标记,我不了解那里,我不能是我可以更有帮助..对不起 – Nihat

0

再试一次:在此之后尝试放置一个别名(名称或leTTER)(我把mm)

JOIN  (SELECT @curRank := 0, @lastPoint := 0) mm 
+0

我仍然得到与 –

+0

相同的错误是否有可能这种说法是在错误的地方?在哪里(p.tourneyid = 1和p.tableid = 2) –

0

不是,但交换的地方的地方和加入加入来之后,从子句中后,其中
改变这个..

WHERE  (p.tourneyid=1 and p.tableid=2) 
    JOIN  (SELECT @curRank := 0, @lastPoint := 0) 

这个

JOIN  (SELECT @curRank := 0, @lastPoint := 0) 
WHERE  (p.tourneyid=1 and p.tableid=2) 

,并保持以前的修复程序以及

+0

我发布为一个新的答案,因为@东西不会让我把它放在它认为我提到多个人 – Nihat

0

这是您的查询的修订版本:

UPDATE tscores JOIN 
     (SELECT p.userid, p.scoreid, 
        IF(@lastPoint <> p.score, 
         @curRank := @curRank + 1, 
         @curRank) AS rank, 
        @lastPoint := p.score 
      FROM  tscores p CROSS JOIN 
        (SELECT @curRank := 0, @lastPoint := 0) const 
      WHERE  (p.tourneyid = 1 and p.tableid = 2) 
      ORDER BY p.score DESC 
     ) ranks 
     ON tscores.scoreid = p.scoreid 
    SET  tscores.scorerank = ranks.rank; 

下面是变化:

  1. 制造上scoreid连接条件。这是tscores上的主要关键,因此只需要这些。
  2. 删除了where子句和userid的冗余条件。
  3. 删除了第二个if()声明,该声明也增加了@curRank
  4. JOIN更改为CROSS JOIN。如果没有on子句,则应该使用CROSS JOIN(即使MySQL确实允许JOIN)。
  5. 为赋值子查询添加了表别名。
  6. 更改set子句以参考rank而不是scorerank
  7. 在条款where条款之前移动了赋值子查询