2017-02-26 2 views
0

테이블 scores을 업데이트하고 won 업데이트 된 값을 사용하여 두 번째 테이블 tbl_users을 업데이트해야합니다. 지금까지 코드는 scores를 업데이트하지만 두 번째 테이블 업데이트를 won의 이전 값을 사용첫 번째 테이블의 값을 사용하여 두 테이블을 동시에 업데이트하십시오.

UPDATE scores a 
left join tbl_users b on 
    a.uid = b.userID 
SET a.won = CASE 
WHEN a.nright = '0' THEN '0' 
WHEN a.nright = '1' THEN '25' 
WHEN a.nright = '2' THEN '50' 
WHEN a.nright = '3' THEN '100' 
WHEN a.nright = '4' THEN '200' 
WHEN a.nright = '5' THEN '400' 
WHEN a.nright = '6' THEN '700' 
WHEN a.nright = '7' THEN '1000' 
END, 
b.pts=b.pts+a.won, 
b.pts_total=b.pts_total+a.won 
WHERE a.uid=$user AND b.userID=$user 
+0

업데이트되는 필드의 실제 순서는 SQL 문에 지정된 순서와 다를 수 있으며 일반적으로 기존 레코드 전체가 첫 번째 변경 전에 반입됩니다. 다른 모든 표현식에서 원 가치를 사용하여 새로운 원 가치를 계산하는 표현식을 반복해야합니다. – Shadow

+0

스키마 및 샘플 데이터를 공유 할 수 있습니까? –

답변

1

싶은하는 것은 명시 적으로 올바른으로 설명되어 있습니다

다음의 두 번째 과제 statement는 col2를 원래 col1 값이 아닌 현재 (업데이트 된) col1 값 으로 설정합니다. 결과는 이며 col1과 col2는 동일한 값을가집니다. 이 동작은 표준 SQL 과 다릅니다.

UPDATE t1 SET col1 = col1 + 1, col2 = col1; 

나는 문제가 set가 이전 테이블에서 값을 끌어 멀티 테이블 업데이트이라고 가정합니다.

변수를 사용하여 문제를 해결할 수도 있습니다. 나는 100 % 확신하지만, 다음은 시도 가치가있다 :

UPDATE scores s JOIN 
     tbl_users u 
     ON s.uid = .uuserID 
    SET s.won = (@w := (CASE WHEN s.nright = '0' THEN '0' 
           WHEN s.nright = '1' THEN '25' 
           WHEN s.nright = '2' THEN '50' 
           WHEN s.nright = '3' THEN '100' 
           WHEN s.nright = '4' THEN '200' 
           WHEN s.nright = '5' THEN '400' 
           WHEN s.nright = '6' THEN '700' 
           WHEN s.nright = '7' THEN '1000' 
         END) 
       ), 
     u.pts = u.pts + @w, 
     u.pts_total = u.pts_total + @w 
    WHERE s.uid = $user ; 

문서는 강하게 set 조항은 하나의 테이블에 대해 순서대로 처리되는 것을 의미한다. 아아, 다중 테이블의 경우 이것이 항상 사실인지 여부는 명확하지 않습니다.

그렇지 않은 경우 두 가지 업데이트를 사용할 수 있습니다.

+0

그것은 효과가 있었지만, 변수가 그것을 알았지 만 올바른 구문을 알지 못했습니다. 고마워. – user1542894

관련 문제