我有一个简单的过程,我试图在一个单一的SQL语句。
我有一个玩家列表(称为tplayers),其中列指示他们的用户id和tourneyid是什么,还有一个“playerpoints”列。我还有一个名为“tscores”的表,其中包含分数、一个用户名和一个名为“rankpoints”的列——我想为每个拥有最高rankpoints的玩家取前3行,并将该值放在tplayers中相应的用户记录中——都是针对特定的tourneyid。
以下是问题:
update tplayers p set playerpoints=
(
select sum(b.mypoints) y from
(
select scorerankpoints as mypoints from tscores t where t.tourneyid=p.tourneyid and p.userid=t.userid and t.scorerankpoints>0 order by scorerankpoints desc limit 3
) as b
) where p.tourneyid='12'
这将生成此错误:“where子句”中的未知列“p.tourneyid”
我基本上希望从tscores表中获取“scorerankpoints”的前3个值,并将其总和放入tplayers表中的一个列中,称为playerpoints,
我想这样做的所有球员和得分谁有相同的巡回赛在他们的表。
似乎对p.tourneyid的内部引用是未定义的。。。有没有办法在一个声明中做到这一点,或者我必须把它分开?
最佳答案
MySQL在解决多层深度的相关引用时遇到问题。这是一个很难解决的问题。
下面使用变量枚举行,然后在update
/join
中选择要聚合的正确行:
update tplayers p join
(select ts.userid, sum(ts.scorerankpoints) as mypoints
from (select ts.*,
@rn := if(@userid = userid, 1, @rn + 1) as rn,
@userid := @userid
from tscores ts cross join
(select @rn := 0, @userid := '') const
where ts.tourneyid = '12'
order by ts.userid, ts.scorerankpoints desc
) ts
where rn <= 3
) ts
on p.userid = ts.userid
set playerpoints = ts.mypoints
where p.tourneyid = '12' ;