1

次のように、支払いが行われていないかどうかを追跡するテーブルがあるとします。

+----+---------+------------+------------+---------+--------+
| id | loan_id | amount_due |   due_at   | paid_at | missed |
+----+---------+------------+------------+---------+--------+
|  1 |    1    |        100 | 2013-08-17 | NULL    | NULL   |
|  5 |    1    |        100 | 2013-09-17 | NULL    | NULL   |
|  7 |    1    |        100 | 2013-10-17 | NULL    | NULL   |
+----+---------+------------+------------+---------+--------+

たとえば、次のように支払いが行われていないかどうかを確認するクエリを実行しました。

UPDATE loan_payments
SET missed = 1
WHERE DATEDIFF(NOW(), due_at) >= 10
AND paid_at IS NULL

次に、id = 1 の行が影響を受けるとします。id = 1 の行の amount_due を次の行の amount_due に追加して、テーブルが次のようになるようにします。

+----+---------+------------+------------+---------+--------+
| id | loan_id | amount_due |   due_at   | paid_at | missed |
+----+---------+------------+------------+---------+--------+
|  1 |       1 |        100 | 2013-08-17 | NULL    |      1 |
|  5 |       1 |        200 | 2013-09-17 | NULL    | NULL   |
|  7 |       1 |        100 | 2013-10-17 | NULL    | NULL   |
+----+---------+------------+------------+---------+--------+

それを行う方法に関するアドバイスはありますか?

ありがとう

4

3 に答える 3

0

残念ながら、現時点では本格的な SQL を書き出す時間がありませんが、実装する必要があると思われる疑似コードを次に示します。

select all DISTINCT loan_id from table loan_payments

for each loan_id:
    set missed = 1 for all outstanding payments for loan_id (as determined by date)
    select the sum of all outstanding payments for loan_id
    add this sum to the amount_due for the loan's next due date after today

純粋な MySQL を使用してループする方法については、http: //dev.mysql.com/doc/refman/5.7/en/cursors.htmlを参照してください。

于 2013-10-04T01:54:00.533 に答える
0

missed_atフィールドを追加して、自分の問題を修正しました。最初の行を= 1に更新する前に、現在のタイムスタンプ ( $now) を変数に入れ、 =を実行して次の行を更新します。missedmissed_at$nowamount_due

UPDATE loan_payments lp1 JOIN loan_payments lp2 ON lp1.due_at > lp2.due_at
SET lp1.amount_due = lp2.amount_due + lp1.amount_due
WHERE lp2.missed_at = $now AND DATEDIFF(lp1.due_at, lp2.due_at) <= DAYOFMONTH(LAST_DAY(lp1.due_at))

LIMIT 1そのクエリを使用するだけで使用できればいいのにと思いますがUPDATEJOIN.

全体として、2 つのクエリを使用して目的を達成しました。それはトリックをしました。

より良い解決策があればアドバイスしてください。

ありがとう!

于 2013-10-04T02:53:59.027 に答える
0

これを見てください :

SQL フィドル

MySQL 5.5.32 スキーマのセットアップ:

CREATE TABLE loan_payments
    (`id` int, `loan_id` int, `amount_due` int, 
     `due_at` varchar(10), `paid_at` varchar(4), `missed` varchar(4))
;

INSERT INTO loan_payments
    (`id`, `loan_id`, `amount_due`, `due_at`, `paid_at`, `missed`)
VALUES
    (1, 1, 100, '2013-09-17', NULL, NULL),
    (3, 2, 100, '2013-09-17', NULL, NULL),
    (5, 1, 100, '2013-10-17', NULL, NULL),
    (7, 1, 100, '2013-11-17', NULL, NULL)
;

UPDATE loan_payments AS l
LEFT OUTER JOIN (SELECT loan_id, MIN(ID) AS ID
            FROM loan_payments
            WHERE DATEDIFF(NOW(), due_at) < 0
            GROUP BY loan_id) AS l2 ON l.loan_id = l2.loan_id
LEFT OUTER JOIN loan_payments AS l3 ON l2.id = l3.id
SET l.missed = 1, l3.amount_due = l3.amount_due + l.amount_due
WHERE DATEDIFF(NOW(), l.due_at) >= 10
AND l.paid_at IS NULL
;

クエリ 1 :

SELECT *
FROM loan_payments

結果

| ID | LOAN_ID | AMOUNT_DUE |     DUE_AT | PAID_AT | MISSED |
|----|---------|------------|------------|---------|--------|
|  1 |       1 |        100 | 2013-09-17 |  (null) |      1 |
|  3 |       2 |        100 | 2013-09-17 |  (null) |      1 |
|  5 |       1 |        200 | 2013-10-17 |  (null) | (null) |
|  7 |       1 |        100 | 2013-11-17 |  (null) | (null) |
于 2013-10-04T04:41:54.333 に答える