MySQL SUM()逐步列入收入

数据库: name_ allmoney

表名: MONEY

 +-----+--------+------------+---------+---------+ | id | name | date | income | account | +-----+--------+------------+---------+---------+ | 1 | Ann | 01.01.2012 | 100 | 100 | | 2 | Matt | 02.01.2012 | 100 | 200 | | 3 | Tom | 03.01.2012 | 100 | 300 | | 4 | Peter | 04.01.2012 | 100 | 400 | +-----+--------+------------+---------+---------+ 

你好Stackoverflowers! ;)

我是MySQL的新手…上周我花了search解决scheme上述情况。 我试着创build脚本总结收入列,但不仅显示列的总和一样

SELECT *,SUM(kasa)从MONEY GROUP BY ID;

但我必须添加新的名为帐户,它有我的Excel表格选项:

 accout1st row =income1+account1 accout2nd row =income2+account1 accout3rd row =income3+account2 accout4th row =income4+account3 

是否有任何代码或可能性在MySQL或PHP中创build类似帐户的列?

 CREATE TABLE money ( id INT(11) NOT NULL AUTO_INCREMENT, date DATE DEFAULT NULL, income DECIMAL(11,4) DEFAULT NULL, numer_kluczyka INT(11) DEFAULT NULL, name CHAR(255) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL, za_co CHAR(255) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL, account INT(11) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

你可以用一个用户variables来做 –

 SELECT @m := 0; SELECT id, name, date, income, @m := @m + income AS balance FROM money ORDER BY date ASC, id ASC; 

顺序应该使用表的主键。

在你的PHP分裂两个查询应该解决这个问题 –

 <?php $connection = mysql_connect('host', 'user', 'pass') or die('failed to connect'); mysql_select_db("album", $connection) or die('failed to select db'); mysql_query("SELECT @m:=0;"); $result = mysql_query("SELECT id, imie_i_nazwisko, data_wplaty, kasa, @m := @m + income AS balance FROM money ORDER BY data_wplaty ASC , id ASC"); while($row = mysql_fetch_array($result)) { echo $row['income'] . " " . $row['balance']; echo "<br />"; } 

如果我正确理解你的问题,你只需要存储在你的PHP循环到目前为止计算的总和。

就像是:

 $account = null; while(($result = /* read mysql result */)) { if (is_null($account)) { // Handle first row $account = $result['income']; } // Show first columns echo $result['id'], $result['income'], $account; $account += $result['income']; } 

你的问题似乎有点不清楚,但是如果我已经猜对了你想要的东西,你可以用一个子选项来完成这个操作,它将所有行上的income列累加到当前行:

 SELECT id, name, date, income, ( SELECT SUM(income) FROM money AS b WHERE b.id = a.id AND b.date <= a.date ) AS balance FROM money AS a 

你也可以用一个连接来做同样的事情:

 SELECT a.id, a.name, a.date, a.income, SUM(b.income) AS balance FROM money AS a JOIN money AS b ON (b.id = a.id AND b.date <= a.date) GROUP BY a.id, a.name, a.date, a.income 

GROUP BY应该在money表的主键上,从你的问题来看,主键应该是什么,因为它似乎不是id

还要注意,这两个答案都假设date列对于每个id是唯一的,并按时间升序sorting,以便条件b.date <= a.date可以查find当前行(包括当前行)的所有行。 如果不是这种情况,您应该修复您的表格,或者相应地调整查询。


编辑: S0pra的PHP解决scheme也将工作。 然而,我读到你的问题的方式,你想要的是每个id分别过去的收入。 如果是这样,你可以使用S0pra的代码进行一些修改:

 $balance = array(); while ( $result = mysql_fetch_assoc( $res ) ) { // or equivalent $id = $result['id']; if ( array_key_exists( $id, $balance ) ) { $balance[$id] += $result['income']; } else { $balance[$id] = $result['income']; // handle first row for this id } $result['balance'] = $balance[$id]; // do something with $result here }