我正在用php/MySql编写一些代码,我需要根据分数值更新一个名为scorerank的字段。 我在这里找到了一个之前的问题,解决了我正在寻找的内容:
更新 MySQL 表中的排名
我修改了他们的示例以使用我的数据库。 我还添加了一个条件,以便我只修改具有特定 tourneyid 和 tableid 的列。 我在内部连接中使用了一个唯一的索引变量来连接要更新的 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 ;
在最后一行中,您尝试使用子查询中的别名。请参阅下面的修复程序
WHERE tscores.scoreid = ranks.scoreid
再尝试一次:尝试在此之后放置别名(名称或leTTER)(我输入mm)
JOIN (SELECT @curRank := 0, @lastPoint := 0) mm
<</div>
div class="one_answers">不是这样,而是交换位置的位置并加入加入来自子句之后而不是在何处
之后 改变这个..
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)
并保留以前的修复程序
下面是查询的修订版本:
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
子句之前。