【问题标题】:eloquent orm or sql statement雄辩的 orm 或 sql 语句
【发布时间】:2014-06-28 19:54:46
【问题描述】:

我正在尝试从交易表中获取当天的总借方、总贷方和可用余额。

到目前为止,我已经尝试过了...

        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 eloquent orm,所以如果 ORM 可能的话,这对我来说将是一个很好的建议。谢谢

【问题讨论】:

  • 您想一整天显示哪个交易描述?
  • 您的预期结果是什么?你能更新问题并发布吗?
  • @AbhikChakraborty 问题已更新。

标签: mysql orm laravel eloquent


【解决方案1】:

你的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 文档中提供了更多功能

【讨论】:

  • 对不起,这只是错字。我也试过这个,但没有给出正确的结果,正如你在 sql fiddle 中看到的那样。
【解决方案2】:

您可以使用相当简单的 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 直接在字段上工作,并且可以更有效地使用索引。

【讨论】:

  • 感谢您的回答,但您能否使用贷方总和和借方总和而不是使用余额来更新您的查询,因为余额不会更新太多,仅用于测试目的。
  • @seoppc 更新了答案。
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
相关资源
最近更新 更多