Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 修改mysql表以显示基于列值的排名_Php_Mysql_Sql - Fatal编程技术网

Php 修改mysql表以显示基于列值的排名

Php 修改mysql表以显示基于列值的排名,php,mysql,sql,Php,Mysql,Sql,我正在用php/MySql编写一些代码,需要根据分数值更新一个名为scorerank的字段。我在这里发现了前面的一个问题,它解决了我所寻找的问题: 我修改了他们的示例以使用我的数据库。我还添加了一个条件,以便只修改具有特定tourneyid和tableid的列。我在id的内部连接中使用了一个唯一的索引变量来更新哪一行-我认为我做得对,但我得到了以下错误: 1248-每个派生表都必须有自己的别名 这是我的密码。有人能发现错误吗 UPDATE tscores JOIN (SELECT

我正在用php/MySql编写一些代码,需要根据分数值更新一个名为scorerank的字段。我在这里发现了前面的一个问题,它解决了我所寻找的问题:

我修改了他们的示例以使用我的数据库。我还添加了一个条件,以便只修改具有特定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 

在最后一行中,您试图使用子查询中的别名。。 请参阅下面的修复程序

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;