雄辩的orm或sql语句

时间:2014-05-11 11:59:54

标签: mysql orm laravel eloquent

我正在尝试从交易表中获得总借记,总信用和当天的可用余额。

到目前为止我已尝试过这个......

        SELECT
        sum(credit),
        sum(debit),
                sum(credit) - sum(debit) as remaining_balance
                FROM transactions
    WHERE user_id = 2
group by created_at;

它没有给出正确的结果。

SQL FIDDLE ....

http://sqlfiddle.com/#!2/25a27/2

我希望得到像银行/ paypal声明这样的结果,例如......

Date  - Debit - Credit - Balance
05/11 - 2.20  -        - 7.3
05/10 -       - 1.5    - 9.5
05/06 -       - 2.5    - 8
05/05 -       - 5.5    - 5.5

我正在使用laravel雄辩的orm,所以如果它可能由ORM对我来说是很好的建议。感谢

2 个答案:

答案 0 :(得分:0)

您的GROUP BY位置错误

按天分组是这样的:

SELECT 
  user_id,
  sum(credit),
  sum(debit),
  sum(credit) - sum(debit) as remaining_balance, 
  txn_description,
  DAY(created_at)
FROM transactions
WHERE user_id = 2
GROUP BY DAY(created_at);

DateTime文档

提供了更多功能

答案 1 :(得分:0)

您可以使用相当简单的JOIN来解决它;

SELECT DATE(a.created_at) date, a.debit, a.credit, 
  SUM(b.credit - b.debit) balance
FROM transactions a
LEFT JOIN transactions b
  ON DATE(a.created_at) >= DATE(b.created_at)
GROUP BY DATE(created_at)
ORDER BY DATE(created_at) DESC

An SQLfiddle to test with

这里的问题是JOIN条件和GROUP BY条件使用在字段上计算的值而不是使用字段本身。这将限制索引的使用,并使查询对于大量数据来说非常慢。

解决方案是添加一个单独的DATE字段,该字段保存事务的日期。这将允许JOIN / GROUP BY直接在字段上工作,并且它可以更有效地使用索引。