Для таких таблиц, как:
Таблица A:
id | tokens
1 | 2
2 | 0
3 | 0
4 | 999
Таблица B:
Id | from | to | amount | status
1 | 1 | 2 | 2 | wait
2 | 1 | 3 | 2 | wait
3 | 4 | 1 | 2 | wait
Как обновить поле токена в таблице A из строк B в единственное ОБНОВЛЕНИЕ?
Я пытался
UPDATE B, A
SET A.tokens=A.tokens-B.amount,
B.status="ok"
WHERE A.id=B.from AND B.status="wait"
В результате получается таблица A:
id | tokens
1 | 0
2 | 0
3 | 0
4 | 999
Таблица B:
Id | from | to | amount | status
1 | 1 | 2 | 2 | ok
2 | 1 | 3 | 2 | ok
3 | 4 | 1 | 2 | ok
Кажется вроде обновление выполнено но количество токенов неверно. Я ожидаю, что:
Таблица A:
id | tokens
1 | 0
2 | 0
3 | 0
4 | 997
Только часть вычета проверена выше. Я не знаю, как одновременно выполнять добавочную часть. Кроме того, возможно ли будет запретить дальнейшее обновление, когда сумма будет отрицательной? В полном решении ожидается:
Если строка 3 в таблице B выполняется между строкой 1 и 2
Таблица A:
id | tokens
1 | 0
2 | 2
3 | 2
4 | 997
Или, если строка 3 таблицы B выполняется после строки 1 и 2, потому что строка 1 или строка 2 будут запрещены для отрицательных токенов 1 в таблице A. Таблица A:
id | tokens
1 | 2
2 | 2/0
3 | 0/2
4 | 997
Может ли кто-нибудь помочь?
Обновление
С помощью следующего я могу выполнить добавление. Таблица A:
id | tokens
1 | 4
2 | 0
3 | 0
4 | 999
Таблица B:
Id | from | to | amount | status
1 | 1 | 2 | 2 | wait
2 | 1 | 3 | 2 | wait
3 | 4 | 1 | 2 | wait
UPDATE table_A, table_B
SET table_A.toekns = CASE
WHEN table_A.id = table_B.from THEN table_A.tokens- table_B.amount
WHEN table_A.id = table_B.to THEN table_A.tokens + table_B.amount
END,
table_B.status = "ok"
WHERE ( table_A.id = table_B.from OR table_A.id = table_B.to ) AND table_B.status = "wait"
Однако результат будет
Таблица A:
id | tokens
1 | 4 //Why is 4 not 2??
2 | 2
3 | 2
4 | 997
Таблица B:
Id | from | to | amount | status
1 | 1 | 2 | 2 | ok
2 | 1 | 3 | 2 | ok
3 | 4 | 1 | 2 | ok