检索和处理无限量的数据

时间:2017-06-17 23:32:26

标签: php mysql recursion

我正在构建一个用于财务预算规划的应用,而且我现在正在打墙。在应用程序中,用户应该每个月预算他的财务。

他增加了交易 - 收入和支出 - 他分别为每个类别分配预算,即杂货500美元。每次他在杂货上花钱时,都会从500美元中减去。但也有可能他花在杂货上的费用超过预算(=超支),甚至可能他甚至在他的整个类别中预算的钱比他实际预算的多(=过度预算)。

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

现在通过上个月的数据来计算这个月的数据并不是一个大问题,但我只计算上个月的正确数据。这似乎是无休止的循环。

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

"种类"表

id |标题

BUDGETS TABLE

category_id | budget_date(2017-06)|量

交易表

id | ...... |日期(2017-06-17)| category_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

1 个答案:

答案 0 :(得分:0)

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

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

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