MYSQL 使用来自 select 语句的结果行执行重复更新

MYSQL perform repeated UPDATEs using resulting rows from select statement

UPDATE tb_user SET user_level = user_level - 100 WHERE id IN (SELECT id FROM tb_levels WHERE factor = 10);

tb_user:

-----------------
 id | user_level
-----------------
  1 | 1000
  2 | 1500
  3 | 3000
  4 | 2500
-----------------

tb_levels:

-----------------
 id | factor
-----------------
  1 | 10
  1 | 10
  2 | 10
  2 | 10
  3 | 12
  5 | 20
-----------------

我认为 tb_user 中的结果应该是:

-----------------
 id | user_level
-----------------
  1 | 800
  2 | 1300

但它是:

-----------------
 id | user_level
-----------------
  1 | 900
  2 | 1400

结果800和1200如何查询?谢谢。

您需要计算 id 在另一个 table 中出现的次数。试试这个:

UPDATE tb_user SET user_level = user_level - (100 * ct) 
FROM tb_user
INNER JOIN 
(
    SELECT id, count(*) ct FROM tb_levels WHERE factor = 10 GROUP BY id
) as idCount ON tb_user.id = idCount.id

类似的东西。使用 JOIN.

UPDATE tb_user u
    JOIN (SELECT id, count(*) AS c FROM tb_levels WHERE factor = 10 GROUP BY id) i ON u.id = i.id
SET user_level = user_level - 100 * i.c