2010-02-16 181 views
3

我想用一個UPDATE/SELECT語句使用計數器變量@row對橋表上的某些行進行編號。例如:在SELECT語句中重置SQL變量

UPDATE teamrank JOIN (SELECT @row := @row + 1 AS position, name FROM members) 
     USING(teamID, memberID) SET rank = position 

是這樣的可能或我需要創建一個遊標嗎?如果有幫助,我使用的是MySQL 5

回答

6

- 總是初始化用戶變量,它們默認否則爲NULL。

SET @prevID:[email protected]:=0; 

UPDATE teamrank t -- one row per team? 
    JOIN members m USING (teamID) -- multiple rows per team? 
    SET rank = 
IF(@prevID != m.teamID, /* Capture when a teamIDs changes */ 
    (@runSum := m.rank) + ((@prevID := m.teamID)*0), /* reset both @runSum and @prevTeam */ 
    (@runSum := @runSum + m.rank) /* increment running sum */ 
) 
-- It is important to have proper sequencing, so to reset @runSum when a teamID changes. 
ORDER BY t.teamID 
; 

我做出了一個假設,即執行團隊排名所需的邏輯是團隊內個人的排名總和。

同樣的技術允許執行任何類型的運行總和或計數器,當「組」更改時需要重置。

- J Jorgenson -

+0

對不起。我最終在「IF」中重置了它。你說得對,'ORDER'對於這個工作很重要。 – 2010-11-04 02:47:58

0

如果我正確地理解你的(不完全)查詢,這應該幫助:

UPDATE teamrank 
    JOIN (
     SELECT @row := @row + 1 AS position, name 
     FROM members, 
      (SELECT @row := 0) AS ObligatoryAlias 
    ) USING(teamID, memberID) 
SET rank = position;