【问题标题】:mysql: running an insert based two other row's valuemysql:运行基于另外两行值的插入
【发布时间】:2016-03-23 21:44:46
【问题描述】:

我有一个包含以下列的表:借方、贷方、借方余额、贷方余额和金额。借记卡和贷记卡都与特定帐户有关。

每次添加新行时,我都希望根据帐户的先前余额分配 debit_balance 和 credit_balance。

INSERT INTO `ledger` (`debit`, `credit`, `debit_balance`, `credit_balance`, `amount`) 
VALUES ('1', '3', 
(SELECT debit_balance FROM `ledger` WHERE `debit` = '1' ORDER BY `id` DESC LIMIT 0,1) + 5, 
(SELECT credit_balance FROM `ledger` WHERE `credit` = '3' ORDER BY `id` DESC LIMIT 0,1) + 5,
'5')

其中借方账户为1,贷方账户为3,我要兑换的金额为5。

当我运行查询时,mysql 给我一个Every derived table must have its own alias 错误。

【问题讨论】:

  • 那个查询没有做你想做的事情是怎么回事?
  • 我收到 Every derived table must have its own alias 错误,但我在赋值位置运行查询,而不是更有意义的连接。
  • 该架构看起来非常奇怪,这可能是您的问题的一部分。真正的分类帐表没有“余额”列,余额只是贷方减去借方的总和。您是否尝试过为您的 ledger 引用添加别名?以AS ledger_a 为例。
  • 大多数会计软件中的总账包括每次交易后的账户余额。我们使用余额列,这样我们就不必每次查看分类帐时都重新计算。

标签: mysql accounting


【解决方案1】:

您可以使用单个 SELECT 查询来提供要插入的值。

INSERT INTO ledger (debit, credit, debit_balance, credit_balance, amount)
SELECT 1, 3, l1.debit_balance + 5, l2.credit_balance + 5, 5
FROM (SELECT MAX(id) AS debit_id FROM ledger WHERE debit = 1) AS maxd
JOIN ledger AS l1 ON l1.id = maxd.debit_id
CROSS JOIN (SELECT MAX(id) AS credit_id FROM ledger WHERE credit = 3) AS maxc
JOIN ledger AS l2 ON l2.id = maxc.credit_id

【讨论】:

  • t这完全有效!试图投票,但SO不会让我。谢谢,巴尔玛!
  • 您需要更多声望才能投票。只需单击复选标记接受答案,表明它解决了问题。
  • 谢谢,感谢这里的指导!
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多