修改mysql表以根据列值显示排名

时间:2014-02-07 21:42:10

标签: php mysql sql

我正在处理php / MySql中的一些代码,我需要根据分数值更新一个名为scorerank的字段。我在这里找到了一个问题,解决了我在寻找的问题:

Update the rank in a MySQL Table

我修改了他们的示例以使用我的数据库。我还添加了一个条件,以便我只修改具有特定tourneyid和tableid的列。我在内部联接中使用了一个唯一的索引变量来识别要更新的行 - 我想我做得对,但我得到以下错误:

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 ;

4 个答案:

答案 0 :(得分:0)

在最后一行中,您尝试使用子查询中的别名。 见下面的修复

WHERE    tscores.scoreid = ranks.scoreid 

答案 1 :(得分:0)

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

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

答案 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) 

并保留以前的修补程序

答案 3 :(得分: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子句之前移动了分配子查询