2013-01-03 82 views
1

我有三個表名爲UserRoleBalance_updatesUser關於用戶的表格保存信息,Role描述了諸如客戶,管理員,經理的用戶的類型和Balance_updates存儲關於餘額的所有交易,即存儲關於與餘額相關的交易的歷史。在Mysql中的特定日期之間實現數據

用戶

+-----------------------+--------------+------+-----+-------------------+-------+ 
| 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.How可以實現在特定date.If在該日期用戶平衡用戶的最新餘額對帳單,然後不改變顯示他在以前的時間平衡上次更改。

任何幫助將不勝感激;

回答

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 

僅有一個題外話忠告:

  • 添加surrogate keyUser(例如User.id);使其成爲主鍵
  • 用(例如)Balance_updates.user_id代替列Balance_updates.username,並存儲對User.id(a foreign key)的引用。

  • 更改列Balance_updates.usernameVARCHAR(20)匹配的User.username
+0

對不起已故的答覆類型....但由於它的工作原理...,我會鍛鍊我的數據庫,正如你所建議的...再次謝謝.. – Runcorn

相關問題