MariaDB / MySQL поле обновления с последним обновлением в одном запросе - PullRequest
0 голосов
/ 26 марта 2020

Для таких таблиц, как:

Таблица 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

1 Ответ

0 голосов
/ 26 марта 2020

Попробуйте запрос, подобный этому:

UPDATE tablea ta
left join tableb tb ON ta.id=tb.`from`
left join ( SELECT `from` ,SUM(amount) as amount from tableb GROUP by `from`) tc ON ta.id=tc.`from`
SET ta.tokens=ta.tokens-tc.amount,
    tb.status="ok"
WHERE tb.status="wait"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...