简体   繁体   中英

Update two tables at once, using values from first table

So I need to Update table scores and use the updated value of column won to update the second table tbl_users . So far the code updates scores , but uses the old value of won for the second table update:

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

What you want to do is explicitly documented as correct:

The second assignment in the following statement sets col2 to the current (updated) col1 value, not the original col1 value. The result is that col1 and col2 have the same value. This behavior differs from standard SQL.

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

I assume that the issue is the multi-table update, where the set pulls the value from the earlier table.

You may be able to fix this using variables. I am not 100% sure, but the following is worth a try:

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 ;

The documentation strongly suggests that the set clauses are processed in order for a single table. Alas, it is not clear whether this is always true for multiple tables.

If not, you can use two updates.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM