2010-02-16 2 views
3

카운터 변수 @row을 사용하여 단일 UPDATE/SELECT 문으로 브리지 테이블의 일부 행 번호를 지정하려고합니다. 예 :SELECT 문 내에서 SQL 변수 재설정

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

커서를 만들 필요가 있습니까? 도움이된다면 내가 제대로 (불완전) 쿼리를 이해한다면, 내가

답변

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 안에서 그것을 다시 끝내었다. 당신 말이 맞아요, '주문'이 제대로 작동하려면 중요합니다. –

0

의 MySQL 5를 사용하고,이 도움이 될 것입니다

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