2017-07-02 44 views
-1

我想用來自同一個表的值的數學運算結果來更新表格單元格。下面你可以看到我的表(這是指定用戶ID的結果):更新表與數學運算來自同一個表的值

=================================== 
DATE  | AMOUNT | DIR | AFTER 
=================================== 
02-07-17 | 8 | 1 | 50 
01-07-17 | 3 | 0 | 42 
28-06-17 | 3 | 0 | 45 
14-11-15 | 8 | 1 | 0 
24-06-15 | 3 | 0 | 0 
22-05-15 | 3 | 0 | 0 
=================================== 

第一列是操作的日期(表顯示指定用戶ID的值與「ORDER BY日期DESC」命令)。第二列(稱爲AMOUNT)是指定給(或從中)指定用戶的帳戶(該列具有UNSIGNED屬性,因此它不能取負值)的點值。第3列(稱爲DIR)是操作方向的二進制值(0 =取自,1 =取)。最後一列(稱爲AFTER)表示每次操作後的當前點值。這表明6月28日用戶有45分。 7月1日他輸了3分,當天的價值已經設定爲42(45-3 = 42)。 7月2日,他得到8分,經常賬戶值爲50(42 + 8 = 50)。

正如你所看到的,只有AFTER列的前3行有值 - 這是因爲我在一年前創建的腳本直到今年6月1日才存儲這些值(甚至沒有列後)。自6月1日以來,我不得不將這些值存儲在數據庫中,這是可行的,但之前的記錄(在我做出更改之前)在2017年6月1日之前的操作後沒有合適的積分值(它們只有零)。所以我需要使用一些php + mysql代碼更新一個表格(這將作爲「同步點」選項手動執行,每個用戶一次),以保持每個用戶的所有「點之後」值正確。

我想我需要:
1.獲得最新的(按日期)金額和後的指定用戶ID值,
2.添加或金額。減去向/從AFTER值(取決於DIR的) ,
3.更新第二排與後新值(有一個值存儲,但它可以被改寫,因爲它應該是相同的),
4.讓第二排的金額和之後,
5.添加或將AMOUNT減去/取自AFTER值(取決於DIR),
6.更新具有新值AFTER的第3行,
7.等c ...等等...(直到最後一個記錄被更新爲止)。

你能幫我一個正確的MySQL查詢或查詢,使其工作?

+0

您需要修復格式設置 – rtfm

+0

「獲取最後(按日期)AMOUNT」。我沒有看到任何日期。 –

+0

是的,我真的很抱歉。感謝Gordon的編輯。 – Vogelek23

回答

0

好的,我已經完成了。許多檢查和測試後,我終於用了一個很簡單的PHP代碼與一個更簡單的MySQL查詢混合

$sql = 'SELECT * FROM points_log WHERE user_id = '.(int)$_GET['u_id'].' ORDER BY date DESC'; // gets all records for specified user ID 
$result = $db->sql_query($sql); 
$previous = $db->sql_fetchrow($result); // processes the first row and prepares the data for further use 

$after = $previous['after']; // gets the most recent value of points 

while ($row=$db->sql_fetchrow($result)) { 
    $id = $previous['id']; // unique ID of the first row 
    $amount = $previous['amount']; // amount from the first row 
    $dir = ($previous['dir'] == 0) ? true : false; // direction of operation (0 = taken from, 1 = given to) 

    if ($dir) { 
     $sql = 'UPDATE points_log SET after='.$after.'+'.$amount.' WHERE id='.$row['id']; //adds points to the current value if they were subtracted previously 
     $db->sql_query($sql); 
     $after = $after+$amount; // sets new value of $after variable 
    } else { 
     $sql = 'UPDATE points_log SET after='.$after.'-'.$amount.' WHERE id='.$row['id']; //subtracts points from the current value if they were added previously 
     $db->sql_query($sql);   
     $after = $after-$amount; // sets new value of $after variable 
    } 
    $previous = $row; // sets previous row with all its values as a current row (required to process all the rows one by one in a loop) 
} 
$db->sql_freeresult($result); 

我現在可以更新點手動登錄了對他的要求每一個用戶。以下你可以找到結果:

=================================== 
DATE  | AMOUNT | DIR | AFTER 
=================================== 
02-07-17 | 8 | 1 | 50 
01-07-17 | 3 | 0 | 42 
28-06-17 | 3 | 0 | 45 
14-11-15 | 8 | 1 | 48 
24-06-15 | 3 | 0 | 40 
22-05-15 | 3 | 0 | 43 
=================================== 

謝謝大家!

相關問題