1

User、、という名前の3つのテーブルがRoleありBalance_updatesます。Userテーブルはユーザーに関する情報を保持し、RoleCustomer、Admin、Managerなどのユーザーのタイプを示し、Balance_updates残高に関するすべてのトランザクションを保存します。つまり、残高に関連するトランザクションに関する履歴を保存します。

テーブル

ユーザー

+-----------------------+--------------+------+-----+-------------------+-------+
| Field                 | Type         | Null | Key | Default           | Extra |
+-----------------------+--------------+------+-----+-------------------+-------+
| username              | varchar(20)  | NO   | PRI | NULL              |       |
| password              | varchar(32)  | NO   |     | NULL              |       |
| email                 | varchar(50)  | YES  |     | NULL              |       |
| role_id               | int(11)      | NO   | MUL | NULL              |       |
| mobile_wallet_balance | double(20,2) | NO   |     | 0.00              |       |
| merit_point           | bigint(20)   | YES  |     | NULL              |       |
| status                | int(11)      | NO   |     | NULL              |       |
| is_auto_btm_enabled   | tinyint(1)   | YES  |     | 0                 |       |
| created_at            | datetime     | YES  |     | NULL              |       |
| updated_at            | timestamp    | YES  |     | CURRENT_TIMESTAMP |       |
| gender                | varchar(20)  | YES  |     | NULL              |       |
| validity              | date         | YES  |     | NULL              |       |
| status_desc           | text         | YES  |     | NULL              |       |
+-----------------------+--------------+------+-----+-------------------+-------+

Role

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(25)  | NO   | UNI | NULL    |                |
| description | varchar(255) | YES  |     | NULL    |                |
| value       | varchar(25)  | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

Balance_updates

+------------+--------------+------+-----+-------------------+----------------+
| Field      | Type         | Null | Key | Default           | Extra          |
+------------+--------------+------+-----+-------------------+----------------+
| id         | int(11)      | NO   | PRI | NULL              | auto_increment |
| username   | varchar(15)  | NO   |     | NULL              |                |
| role_id    | int(11)      | YES  |     | NULL              |                |
| amount     | double(20,2) | YES  |     | NULL              |                |
| updated_at | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+------------+--------------+------+-----+-------------------+----------------+

Balance_updatesのデータ

目的

任意の日付ですべてのユーザーとそれぞれの残高を生成したいと思います。たとえば、特定の日付の貸借対照表が必要な場合は、2012-12-28から最新の貸借対照表を生成する必要がありBalance_updatesます。

私が試したこと

SELECT DISTINCT (
u.username
), r.value, u.amount AS `amount`
FROM Balance_updates u
INNER JOIN Role r ON u.role_id = r.id
WHERE u.amount > 0.0 && UNIX_TIMESTAMP( u.updated_at ) < UNIX_TIMESTAMP( '2013-1-3 23:59:59' )
ORDER BY r.value, UNIX_TIMESTAMP( u.updated_at ) DESC

結果と問題

ご想像のとおり、Balance_updatesからすべての値、つまり記録された他のすべてのユーザートランザクションが返されます。

質問:

1.特定の日付のユーザーの最新の残高ステートメントを取得するにはどうすればよいですか。その日付のユーザー残高が変更されていない場合は、最後に変更された前回の残高を表示します。

どんな助けでもありがたいです。

4

1 に答える 1

2

テストされていませんが、これでうまくいく(そして最適化できる)と感じています。

SELECT DISTINCT u.username, r.value, u.amount AS `amount`
FROM Balance_updates u
INNER JOIN Role r ON u.role_id = r.id
WHERE u.updated_at = (
    SELECT MAX(inner_u.updated_at)
    FROM Balance_updates AS inner_u
    WHERE
        inner_u.username = u.username
        && amount > 0
        && UNIX_TIMESTAMP( inner_u.updated_at ) < UNIX_TIMESTAMP( '2013-1-3 23:59:59' )
)
ORDER BY r.value, UNIX_TIMESTAMP( u.updated_at ) DESC

トピックから外れたアドバイスが1つだけあります。

  • テーブルに代理キーを追加しますUser(例User.id)。それを主キーにします
  • Balance_updates.usernameを(eg)に置き換え、 (外部キーBalance_updates.user_id)への参照を格納します。User.id

また

  • 次のタイプに一致するように列Balance_updates.usernameをaに変更しますVARCHAR(20)User.username
于 2013-01-03T11:18:33.083 に答える