2017-02-26 133 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

你想要做什么明确记载是正确的:

在下面的第二次分配语句将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

相关问题