Php 修改mysql表以显示基于列值的排名
我正在用php/MySql编写一些代码,需要根据分数值更新一个名为scorerank的字段。我在这里发现了前面的一个问题,它解决了我所寻找的问题: 我修改了他们的示例以使用我的数据库。我还添加了一个条件,以便只修改具有特定tourneyid和tableid的列。我在id的内部连接中使用了一个唯一的索引变量来更新哪一行-我认为我做得对,但我得到了以下错误: 1248-每个派生表都必须有自己的别名 这是我的密码。有人能发现错误吗Php 修改mysql表以显示基于列值的排名,php,mysql,sql,Php,Mysql,Sql,我正在用php/MySql编写一些代码,需要根据分数值更新一个名为scorerank的字段。我在这里发现了前面的一个问题,它解决了我所寻找的问题: 我修改了他们的示例以使用我的数据库。我还添加了一个条件,以便只修改具有特定tourneyid和tableid的列。我在id的内部连接中使用了一个唯一的索引变量来更新哪一行-我认为我做得对,但我得到了以下错误: 1248-每个派生表都必须有自己的别名 这是我的密码。有人能发现错误吗 UPDATE tscores JOIN (SELECT
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
在最后一行中,您试图使用子查询中的别名。。 请参阅下面的修复程序
WHERE tscores.scoreid = ranks.scoreid
再尝试一次:尝试在我输入mm后加上别名或字母
JOIN (SELECT @curRank := 0, @lastPoint := 0) mm
不是那样,而是交换where和join COMPES after from子句的位置,而不是where后面 改变这个
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。
将连接更改为交叉连接。如果没有on子句,则应该使用交叉连接,即使MySQL确实允许连接。
为分配子查询添加了表别名。
将set子句更改为引用rank而不是scorerank。
将赋值子查询移到where子句之前。
我仍然得到同样的错误:更新tscores。。。设置tscores.scorerank=ranks.scorerank,其中tscores.scoreid=ranks.scoreid有一些标记我不理解,我无法理解,我可以提供更多帮助。。对不起,这句话可能放错地方了吗?其中p.tourneyid=1和p.tableid=2,我是作为一个新答案发布的,因为@stuff不允许我这么说,因为它认为我提到了不止一个人
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;