MySQL Обновить значение поля с помощью подзапроса с несколькими возвращаемыми строками - PullRequest
0 голосов
/ 11 декабря 2010

У меня есть две таблицы "банк" и "облигации".У каждого пользователя есть банковская запись, но может быть 0, 1 или более записей облигаций.

Я хочу написать скрипт, который обновляет поле «cash» в таблице «bank» с учетом интересов нескольких облигаций.пользователь может держать.Проценты начисляются по полям купонов IssuePrice * таблицы «облигации».Но поскольку пользователь может иметь несколько облигаций, он должен делать это для каждой облигации.

В данный момент я пробовал что-то вроде этого:

$MySQL->db_Query("UPDATE bonds bo, bank ba SET 
        ba.cash = ROUND(ba.cash + (bo.issuePrice * bo.coupon), 2), 
        ba.earned = ROUND(ba.earned + (bo.issuePrice * bo.coupon), 2) 
    WHERE LOWER(ba.user) = LOWER(bo.holder) AND 
        LOWER(bo.holder) <> LOWER('Bank');");

Но это не дает ожидаемогоисход.Я попробовал это с пользователем с 2 облигациями, если обе облигации должны давать по 500 процентов каждая, то есть всего 1000, это добавляет только 500, как будто есть только 1 облигация.Если я установлю одну облигацию как 500 процентов, а другую - с процентной ставкой 1000, она внезапно прибавит 475.

Ответы [ 2 ]

1 голос
/ 11 декабря 2010

Вероятно, стоит убедиться, что ваш оператор UPDATE пытается обновить строку каждого пользователя ровно один раз. Подзапрос - лучший способ сделать это, наиболее эффективно реализованный как объединенная таблица:

UPDATE bank 
JOIN (SELECT LOWER(bonds.holder) as user,
    SUM(bonds.issuePrice * bonds.coupon) as total
    FROM bonds
    WHERE LOWER(bonds.holder) != 'bank'
    GROUP BY user
) as increments ON increments.user = LOWER(bank.user)
SET bank.cash = ROUND(bank.cash + increments.total, 2),
    bank.earned = ROUND(bank.earned + increments.total, 2)

(Для большей оптимизации вызовы LOWER и ROUND, вероятно, следует исключить, но это другое обсуждение.)

0 голосов
/ 11 декабря 2010

Самый простой способ - использовать подвыборы и обновлять поля по отдельности ...

UPDATE bank ba1
SET ba1.cash = ba1.cash + (ROUND(SELECT SUM(bo.issuePrice * bo.coupon)
               FROM bank ba2 JOIN bonds bo ON bo.user = ba2.user
               WHERE ba2.user = ba1.user), 2)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...