如何从MYSQL结果集中实现2行的复杂总和


How to achieve this complex sum of 2 rows from a MYSQL result set?

假设我有一张这样的表(这里的美元符号只是为了美化…):

DATE        | CREDIT    | DEBIT
2013-11-28  | $ 100     | $ 0
2013-11-29  | $ 20      | $ -10
2013-12-01  | $ 150     | $ 0
2013-12-02  | $ 100     | $ -10

经过一些研究,到目前为止(我需要的一部分),利用MYSQL用户变量所取得的成就是:

DATE        | CREDIT    | DEBIT    | MONTH SUM   | TOTAL SUM   | MONTH
2013-11-28  | $ 100     | $ 0      | $ 100       | $ 100       | 11
2013-11-29  | $ 20      | $ -10    | $ 110       | $ 110       | 11
2013-12-01  | $ 150     | $ 0      | $ 150       | $ 260       | 12
2013-12-02  | $ 100     | $ -10    | $ 240       | $ 350       | 12


这是我用来获得以下结果的MYSQL查询:

SELECT V.*,
IF(DATE_FORMAT(date, '%m') != @month,
@month_sum := credit + debit,
@month_sum := @month_sum + (credit + debit)) as month_sum,
@total_sum := @total_sum + (credit + debit) as total_sum,
@month := DATE_FORMAT(date,'%m') as month
FROM tbl_values V
JOIN (SELECT @month := 0, @month_sum := 0, @total_sum := 0) D
ORDER BY date ASC


现在,这里是棘手的部分:假设我想在PHP页面上对这些结果进行分页,在那里我每2行都使用这些结果(为了简单起见)
如果我尝试使用LIMIT子句,我会丢失最后一页的MYSQL用户变量值(因为我在JOIN子句中将它们设置为0,但如果我不这样做,事情就不会顺利,相信我)

有没有一种方法可以只在MYSQL中使用单个查询来实现这一点?如果没有,可以使用2个或多个查询,但我应该能够在结果中分页,保留前"month_sum"answers"total_sum"行的值
也许我应该放弃MYSQL,只通过PHP来实现它
请记住,性能也是一个问题,因为我无法确定我将处理多少张唱片,可能很快就会超过数千张。

这是表格结构和数据,以防你们想测试一下。任何方向都很感激,谢谢!

-- STRUCTURE:    
CREATE TABLE IF NOT EXISTS `tbl_values` (
`date` date NOT NULL,
`credit` float NOT NULL,
`debit` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DATA
INSERT INTO `tbl_values` (`date`, `credit`, `debit`) VALUES
('2013-11-28', 100, 0),
('2013-11-29', 20, -10),
('2013-12-01', 150, 0),
('2013-12-02', 100, -10);

类似的东西?

SELECT * FROM(SELECT V.*,
IF(DATE_FORMAT(date, '%m') != @month,
@month_sum := credit + debit,
@month_sum := @month_sum + (credit + debit)) as month_sum,
@total_sum := @total_sum + (credit + debit) as total_sum,
@month := DATE_FORMAT(date,'%m') as month
FROM tbl_values V
JOIN (SELECT @month := 0, @month_sum := 0, @total_sum := 0) D
ORDER BY date ASC)z LIMIT 2

SQL Fiddle

显示数据时,在PHP中这样做可能更好。创建查询后,可以使用data_seek方法移动到要显示的第一行。

因此,如果您在第一页上,则从第1行开始,显示15行。在第x页上,您查找相应的行,然后从那里开始循环。

请参阅:http://www.php.net/manual/en/mysqli-result.data-seek.php