我正在处理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 ;
答案 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;
以下是更改:
scoreid
上建立了加入条件。这是tscores
的主键,因此只需要这一切。where
上的userid
子句和冗余条件。if()
语句,该语句也增加了@curRank
。JOIN
更改为CROSS JOIN
。如果没有on
子句,则应使用CROSS JOIN
(即使MySQL确实允许JOIN
)。set
子句以引用rank
而不是scorerank
。where
子句之前移动了分配子查询。