繁体   English   中英

如何从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”和“ 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小提琴

显示数据时,最好在PHP中执行此操作。 创建查询后,可以使用data_seek方法移至要显示的第一行。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM