我正在尝试在单个SQL语句中执行一个简单的过程。
我有一个玩家表(称为tplayers),其中的列表示他们的用户ID和tourneyid是什么,以及“playerpoints”列。我还有一个名为“tscores”的表,其中包含分数,一个用户ID和名为“rankpoints”的列 - 我想在每个玩家中排名最高的前三行,并将该值放在tplayers中相应的用户记录中 - - 所有特定的锦标赛。
以下是查询:
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的内部引用是未定义的......有没有办法在单个语句中执行此操作,还是必须将其分解?
答案 0 :(得分:2)
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' ;