2017-07-02 8 views
-1

同じテーブルの値に対して数学演算の結果を使ってテーブルセルを更新したいとします。 (表は「日付DESC BY ORDER」の順序で指定されたユーザー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の結果があります)。第2列(AMOUNTと呼ばれる)は、指定されたユーザーのアカウントに与えられたポイントの値です(この列にはUNSIGNED属性があり、負の値を取ることはできません)。第3列(DIRと呼ばれる)は、操作方向のバイナリ値です(0 = 1からの距離)。最後の列(AFTERと呼ばれます)は、各操作後の現在の点の値を示します。これは、6月28日にユーザーが45ポイントを持っていたことを示しています。 7月1日に3ポイントを失い、その日のAFTER値は42に設定されました(45-3 = 42)。 7月2日、彼は8ポイントを獲得し、経常収支は50(42 + 8 = 50)です。

あなたが見ることができるように、列の後の最初の3行は値を持っている - 私は一年前に作成したスクリプトは、今年6月1日までは、これらの値を保存していなかったためである(と呼ばれるも、何の列はありませんでしたアフター)。 6月1日以降、これらの値をDBに保存する必要がありますが、これは機能していますが、以前のレコード(変更前)は2017年6月1日以前の操作後に正しい値を持っていません)。だから私は、すべての "ポイント後"の値をすべてのユーザーに正しく維持するために、いくつかのPHP + mysqlコード(ユーザーごとに一度 "同期ポイント"オプションとして手動で実行される)を使用してテーブルを更新する必要があります。

私は私がする必要があると思う:
1に/値の後からの追加やsubstract量は(DIRに依存)
2.、最新の(日付別)量と、指定されたユーザIDの値の後を取得、
AFTERの新しい値で 3.更新2NDのROW(そこに格納された値があるが、それは同じでなければなりませんよう、それは上書きすることができます)、
4. 2列目の金額を取得し、AFTER、
5.追加したり、 AFTER、
7らの新しい値に/値の後から(DIRに依存する)substract AMOUNT、
6アップデート3RDのROW c ... etc ...(最後のレコードが更新されるまで、すべてループしてください)。

正しく動作するように、正しいMySQLクエリまたはクエリを教えてください。

+0

あなたはフォーマット – rtfm

+0

「最後の(日付別)金額を取得する」を修正する必要があります。私は日付が表示されません。 –

+0

はい、本当に残念です。編集のためにゴードンに感謝します。 – Vogelek23

答えて

0

さて、私はそれをしました。

$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); 

私は今、ポイントは彼の要求にすべての単一のユーザのために手動でログインし更新することができるよ:多くのチェックやテストの後、私は最終的にはるかに簡単なMySQLのクエリと混合して、非常に単純なPHPコードを使用しました。結果は次のとおりです。

=================================== 
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 
=================================== 

ありがとうございます!

関連する問題