假设我有一张这样的桌子(这里的美元符号只是为了美化......):
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页面上对这些结果进行分页,我在每两行使用这些结果(为简单起见)。
如果我尝试使用LIMIT子句来执行它,我将从最后一页丢失MYSQL用户变量值(因为我在JOIN子句中将它们设置为0,但如果我不这样做,那么事情就赢了'好吧,相信我。)
有没有办法只使用单个查询在MYSQL中执行此操作?如果没有,可以使用2个或更多查询,但我应该能够对结果进行分页,保留前一个“month_sum”和“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);
答案 0 :(得分:1)
这样的东西?
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
答案 1 :(得分:0)
在显示数据时,最好在PHP中执行此操作。创建查询后,可以使用data_seek方法移动到要显示的第一行。
所以,如果你在第一页,你从第1行开始,显示15行。在第x页上,您寻找合适的行,然后从那里开始循环。
请参阅:http://www.php.net/manual/en/mysqli-result.data-seek.php