Ваш запрос UPDATE
не имеет критериев, ограничивающих область обновления только теми, на которые влияет due_date
.
Кроме того, поскольку вы не используете функцию агрегирования в таблице ссуд, MySQLсвободно выбирать любое значение из тех, которые были сгруппированы.Это может привести к неожиданным результатам.
Чтобы решить эту проблему, вы можете изменить подзапрос SET
на JOIN
.Это предотвратит несогласованные записи из таблицы ссуд от обновления таблицы соревнований с нулями.А также уменьшите количество запросов, которые могут возникнуть, поскольку использование подзапроса в SET
потребует выдачи запроса для каждой записи, чтобы соответствовать текущей строке в соревнованиях, которая обновляется с помощью набора.
UPDATE competitions AS c
INNER JOIN (
SELECT l.competitions_id, SUM(l.due_amount) AS total_due
FROM loans AS l
WHERE l.due_date = '2018-10-28'
GROUP BY l.competitions_id
#optionally limit scope to those that have an amount due
#HAVING total_due > 0
) AS d
ON d.competitions_id = c.id
SET c.cash = c.cash - d.total_due
Набор данных
competitions
---
| id | cash |
|-----|------|
| 1 | 5.00 |
| 2 | 2.00 |
| 3 | 0.00 |
loans
---
| id | competitions_id | due_amount | due_date |
|----|-----------------|------------|------------|
| 1 | 1 | 1.00 | 2018-10-19 |
| 2 | 1 | 1.00 | 2018-10-28 |
| 3 | 2 | 1.00 | 2018-10-28 |
| 4 | 1 | 1.00 | 2018-10-28 |
| 5 | 3 | 1.00 | 2018-11-19 |
Результат
| id | cash | total_due | cash_after_deduction | loan_deductions |
|----|------|-----------|----------------------|-----------------|
| 1 | 5 | 2 | 3 | 2 |
| 2 | 2 | 1 | 1 | 1 |
Thisсначала извлекает значения competitions_id
и due_amount
из таблицы ссуд, на которые влияют due_date
.
Обновления базовой таблицы competitions
затем ограничиваются INNER JOIN
, который включаеттолько записи, совпадающие с записями в таблице ссуд.
Я использовал SUM
в качестве агрегатной функции, чтобы гарантировать, что все due_amount
записей по всем ссудам для Competitions_id суммируются.Это похоже на то, что вы намеревались, если нет, и вы хотите один due_amount
, запрос может быть изменен в соответствии с желаемыми результатами.