【问题标题】:How to achieve this complex sum of 2 rows from a MYSQL result set?如何从 MYSQL 结果集中实现 2 行的复杂总和?
【发布时间】:2013-12-21 10:42:02
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql sql


    【解决方案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
    

    SQL Fiddle

    【讨论】:

    • 经过一整天的努力,只需要一个子查询和另一个 SELECT,真的吗?大声笑,像魅力一样工作,谢谢! :)
    【解决方案2】:

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

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

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

    【讨论】:

    • 听起来是个好主意...但是为了使它起作用,我需要从表中获取所有行一次,在 MYSQL 中求和,然后使用 data_seek 获取最后一个在我要展示的那些之前,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多