Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL语法问题_Sql_Mysql - Fatal编程技术网

SQL语法问题

SQL语法问题,sql,mysql,Sql,Mysql,关于更新的SQL语法问题。通过下面的例子提问会容易得多: **Payments Table** ID user_id payment_due payment_made 1 3 10.0 5.0 1 3 10.0 10.0 1 9 20.0 20.0 **Balance Table** ID user_id current_balance

关于更新的SQL语法问题。通过下面的例子提问会容易得多:

**Payments Table**

ID  user_id  payment_due   payment_made 
1      3        10.0           5.0
1      3        10.0           10.0
1      9        20.0           20.0



**Balance Table**

ID  user_id    current_balance 
1      3            ???
2      9            ???
假设我想更新特定用户的当前余额。添加所有支付费用并从为特定用户支付的所有费用中减去这些费用,正确而高效的SQL语法是什么

在这种情况下,用户“3”的当前_余额为5.0,用户“9”的当前_余额为0.0

select
   ID,
   user_id,
   (sum(payment_due) - sum(payment_made)) current_balance
from
   PaymentsTable

group by
   ID,
   user_id
那么:

select
   ID,
   user_id,
   (sum(payment_due) - sum(payment_made)) current_balance
from
   PaymentsTable

group by
   ID,
   user_id

您需要使用子查询。像这样的方法应该会奏效:

UPDATE
    balance_table b
SET
    current_balance = (SELECT
            SUM(payment_due - payment_made)
        FROM
            payments_table p
        WHERE
            p.user_id = b.user_id)

您需要使用子查询。像这样的方法应该会奏效:

UPDATE
    balance_table b
SET
    current_balance = (SELECT
            SUM(payment_due - payment_made)
        FROM
            payments_table p
        WHERE
            p.user_id = b.user_id)

要更新表,请使用子查询:

UPDATE Balance_Table b
SET current_balance =
  ( SELECT SUM( payment_due - payment_made )
    FROM Payments_Table p
    WHERE p.user_id = b.user_id
  )

考虑一下更新方法。您的
余额表
将在
付款表
更改后立即失去同步,因此您最好从中实际选择数据。

要更新您的表,请使用子查询:

UPDATE Balance_Table b
SET current_balance =
  ( SELECT SUM( payment_due - payment_made )
    FROM Payments_Table p
    WHERE p.user_id = b.user_id
  )

考虑一下更新方法。您的
余额表
将在
付款表
更改后立即失去同步,因此您最好从中实际选择数据。

这可能是最好的方法。不要保留
余额
表格,因为余额会不断变化。您甚至可以将此查询转换为视图,使其行为类似于
余额
表。或者使用触发器保持数据同步。如上所述,不要保持余额表…存储计算字段(当前余额)违反了规范化规则,请使用查询在fly上获取数据感谢所有人的建议。我认为最好不要使用当前的平衡表,这可能是最好的方法。不要保留
余额
表格,因为余额会不断变化。您甚至可以将此查询转换为视图,使其行为类似于
余额
表。或者使用触发器保持数据同步。如上所述,不要保持余额表…存储计算字段(当前余额)违反了规范化规则,请使用查询在fly上获取数据感谢所有人的建议。我认为最好不要使用当前的余额表我想他可以在
付款
表上触发这个更新语句。这将消除一些差异。@cmptrgeekken:使用触发器是可能的。如果
Payments\u Table
中有很多记录,但只有很少的记录更改,并且经常查询
Balance\u Table
的结果,那么这可能是正确的方法。否则,只对
Payments\u Table
进行汇总将是更简单的方法。我想他可以在
Payments
表上触发这个更新语句。这将消除一些差异。@cmptrgeekken:使用触发器是可能的。如果
Payments\u Table
中有很多记录,但只有很少的记录更改,并且经常查询
Balance\u Table
的结果,那么这可能是正确的方法。否则,只需将付款汇总到表中就更容易了。