我有三个名为User
,Role
和Balance_updates
的表。 User
表保存有关用户的信息,Role
描述用户类型,如客户,管理员,经理和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.如何在特定日期实现用户的最新余额对账单。如果在该日期用户余额未更改,则显示上次更改的上一次余额。
任何帮助将不胜感激;
答案 0 :(得分: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
只有一个偏离主题的建议:
User
添加surrogate key(例如User.id
);把它作为主键Balance_updates.username
列替换为(例如)Balance_updates.user_id
,并存储对User.id
的引用(foreign key)。或
Balance_updates.username
更改为VARCHAR(20)
以匹配User.username
的类型