使用第一个表中的值一次更新两个表

时间:2017-02-26 10:47:45

标签: mysql sql sql-update case

所以我需要更新表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

1 个答案:

答案 0 :(得分:1)

您要做的事情明确记录为正确:

  

以下语句中的第二个赋值将col2设置为   当前(更新)col1值,而不是原始col1值。结果   是col1和col2具有相同的值。这种行为不同于   标准SQL。

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

我认为问题是多表更新,其中set从早期表中提取值。

您可以使用变量解决此问题。我不是百分百肯定,但以下值得一试:

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子句以便单个表。唉,目前尚不清楚多个表是否总是如此。

如果没有,您可以使用两次更新。