【问题标题】:Retrieving and handling an infinite amount of data检索和处理无限量的数据
【发布时间】:2017-06-17 23:32:25
【问题描述】:

我正在构建一个用于财务预算规划的应用程序,但我现在遇到了困难。在应用程序中,用户应该每个月都为自己的财务做预算。

他添加交易(收入和支出),并为他的每个类别单独分配预算,即 500 美元用于杂货。每次他在杂货上花点钱,都会从这 500 美元中扣除。但也有可能他在杂货上的花费超过了他的预算(= 超支),甚至他在各个类别中的预算甚至比他实际拥有的更多(= 超支)。

问题是:我不知何故需要处理理论上无限量的先前数据。因为用户在前几个月超支或超支的一切都需要流血到今天。这意味着:如果用户在 1 月份超支了 500 美元并且尚未补偿,那么这 500 美元仍然需要在 6 月份截断他的可用预算。

现在通过上个月的数据计算这个月的数据已经不是什么大问题了,但是我在计算前一个月的时候只得到了上个月的正确数据。这似乎是无限循环。

数据库结构的简化版本如下:

“类别”表

标识 |标题

预算表

category_id |预算日期 (2017-06) |金额

交易表

标识 | ... |日期(2017-06-17) |类别 ID |流出 |流入

您对如何在此处进行操作有任何想法吗?我希望我没有忽略类似的问题,但我什至不确定我在寻找什么。我只需要找到一种方法来正确计算每个月的可用预算,无论超支/预算超支在历史上有多远。

非常感谢您。


编辑:我已经添加了我构建的查询,但它似乎不起作用,它提供了错误的结果。知道如何改进它吗?

SELECT category AS category_id,  
  SUM(outflow) AS outflows,  
  SUM(inflow) AS inflows,  
  SUM(amount) AS amounts,  
  SUM(amount) - SUM(inflow) - SUM(outflow) AS total  
FROM transactions  
LEFT JOIN budgets ON (transactions.category = budgets.cat_id  
  AND DATE_FORMAT(transactions.date, "%Y-%m") = 
  DATE_FORMAT(budgets.date, "%Y-%m"))  
WHERE DATE_FORMAT(transactions.date, "%Y-%m") < "' . $date . '"  
GROUP BY transactions.category ASC

【问题讨论】:

  • 您需要计算所欠的“净额”(负数或正数),并将其应用于该月的可用资金。
  • 您可以按类别进行查询,获取所有交易的总和。如果您加入预算并乘以月数,他们是否在一个月内过度/不足并不重要 - 因为他们会平衡以表明他们在哪里违反预算。您还可以进行 2 个查询:过去几个月和当前月份以显示当前与历史记录。
  • @SloanThrasher 谢谢。我已经尝试了一切,但它似乎不像我构建查询的方式那样工作。你介意看看上面吗?
  • @Rogue 谢谢,我正在尝试,但到目前为止它不起作用......
  • 您的查询中有哪些“不起作用”?您能否提供一个示例说明预期的输出以及您目前得到的结果?

标签: php mysql recursion


【解决方案1】:

我认为问题在于您的查询包含并因此汇总了每个交易行的一个预算行。相反,它应该在每个类别中只包含一次预算行。

这假定对于预算表中的给定月/年日期,每个类别只有一行。

SELECT category AS category_id,  
    SUM(a.outflow) AS outflows,  
    SUM(a.inflow) AS inflows,  
    b.amount AS amounts,  
    b.amount - SUM(a.inflow) - SUM(a.outflow) AS total  
FROM transactions a
LEFT JOIN budgets b
    ON a.category = b.cat_id  
    AND DATE_FORMAT(MAX(a.date), "%Y-%m") = DATE_FORMAT(b.date, "%Y-%m")
WHERE DATE_FORMAT(a.date, "%Y-%m") < "' . $date . '"  
GROUP BY a.category ASC, b.amount

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多