обновление строк до совпадения суммы? - PullRequest
0 голосов
/ 31 июля 2011

У меня есть таблица, которая выглядит как

id
Тип: Auto inc-int
Комментарий: уникальный идентификатор
Значение вставлено auto inc int

dateGained
Тип: dateTime
Комментарий: дата получения валюты
Введенное значение: текущая дата / время

amntGained
Тип: число с плавающей запятой
Комментарий: сумма полученной валюты
Введенное значение: полученное значение (например, 0,25)

amntUsed
Тип: число с плавающей запятой
Комментарий:Когда используется часть значения, этот столбец обновляется
Добавленное значение: 0

uuid
Тип: uuid
Комментарий: пользователи uuid
Значение вставлено: (uuid)

так что несколько примеров строк (для одного пользователя) будут

1 | 2010-07-30 00:00:00 | 0.25 | 0.20 | [uuid]  
2 | 2010-08-12 00:00:00 | 1.75 | 0.00 | [uuid]  
3 | 2010-08-17 00:00:00 | 8.25 | 0.00 | [uuid]  
4 | 2010-09-15 00:00:00 | 0.05 | 0.00 | [uuid]  

Теперь мой вопрос вокруг логики:

В основном у меня естьфункция, которой присваивается значение uuid и сумма, затем функция должна пройти через , начиная с самой старой , и обновить используемое значение до тех пор, покаудовлетворен.

например, если функция была задана 6.25 и [uuid]

Таблица будет выглядеть так:

1 | 2010-07-30 00:00:00 | 0.25 | 0.25 | [uuid] //still need to use 6.20  
2 | 2010-08-12 00:00:00 | 1.75 | 1.75 | [uuid] //still need to use 4.45 
3 | 2010-08-17 00:00:00 | 8.25 | 4.45 | [uuid] //we now have 3.80 remaining 
4 | 2010-09-15 00:00:00 | 0.05 | 0.00 | [uuid] //this row is untouched 

, но у меня нет ясного представления о том, каксделать это эффективно или вообще в этом отношении.

1 Ответ

1 голос
/ 31 июля 2011

Будет ли у вас работать? ( Обновленная версия)

UPDATE table1 t3
INNER JOIN
(
SELECT t1.id, IFNULL(SUM(t2.amntGained),0) as total // 0 for the smallest date
FROM table1 t1
LEFT JOIN table1 t2 ON (t2.uuid = t1.uuid AND t2.dateGained < t1.dateGained)
// LEFT JOIN,not INNER because "<" is used for joining, 
WHERE uuid = 1
GROUP BY t1.id
)X  ON (X.id=t3.id)
SET t3.amntUsed = IF(X.total+t3.amntGained <=6.25, t3.amntGained, 
 IF(6.25-X.total>0, 6.25-X.total,0))
WHERE t3.uuid=1

Для ваших данных:

id - total - amntGained - X.total+t3.amntGained - 6.25-X.total>0 - new.amntUsed
1  - 0     - 0.25      - 0.25                   - true             0.25
2  - 0.25  - 1.75      - 2                      - true             1.75
3  - 2     - 8.25      - 10.25                  - true             6.25-2 = 4.25
4  - 10.25 - 0.05      - 10.30                  - false            0
...