2014-02-10 26 views
1

我有一個簡單的過程,我試圖在單個SQL語句中執行。在compund MySQL語句中使用max和limit

我有一張桌面上的玩家(稱爲tplayers),其中有一列表示他們的用戶ID和錦標賽,以及一個「玩家點數」列。我還有一張名爲「tscores」的表格,其中包含分數,用戶標識和名爲「rankpoints」的列 - 我希望每個玩家排名最高的排名前3排,並將該值放入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' 

這會產生這樣的錯誤:在未知列'p.tourneyid「where子句」

基本上,我希望利用「scorerankpoints的前3名值「從桌面tscores並將總結值放入一個名爲玩家積分的表格玩家的列中,我想爲所有玩家和在桌面上都有相同錦標賽的玩家進行此操作。

似乎p.tourneyid的內部引用是未定義的......有沒有辦法在單個語句中執行此操作,還是必須將其分解?

回答

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' ; 
+0

你會推薦,我只是把語句拆分成單獨的操作? 在我看來,這種行爲是不可預知的,所以如果我沒有在單個複合語句中做所有這些,那麼是否會有顯着的性能下降? –

+0

@ S.ov。 。 。我非常喜歡把事情放入一個查詢中,而不是將它們分開。我認爲這種方法沒有顯着的性能影響。但是,我必須承認,從調用代碼的角度來看,做兩個單獨的查詢可能會很清楚。 –