You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对不同表的两列求和及相关MariaDB SQL语法报错解决

错误原因

你写的SQL存在两个核心问题:

  • 语法层面:两个子查询的运算结果没有外层SELECT包裹,无法直接作为查询内容、定义别名
  • 逻辑层面:WHERE条件放在语句末尾不会作用到两个子查询内部,会导致你查询的是两个表全表的amount总和,而非指定用户的总和

快速修正代码

直接调整SQL结构即可正常运行:

$username = mysqli_real_escape_string($con, $_SESSION['username']); 
$qry = "SELECT 
          (SELECT SUM(amount) FROM deposits WHERE username = '$username') 
          + 
          (SELECT SUM(amount) FROM referral WHERE username = '$username') 
          AS value_sum";

优化方案(避免空值异常)

如果某张表没有对应用户的记录,SUM()会返回NULL,最终求和结果也会变成NULL,可以用COALESCE函数把空值转为0规避这个问题:

$username = mysqli_real_escape_string($con, $_SESSION['username']); 
$qry = "SELECT 
          COALESCE((SELECT SUM(amount) FROM deposits WHERE username = '$username'), 0)
          +
          COALESCE((SELECT SUM(amount) FROM referral WHERE username = '$username'), 0)
          AS value_sum";

更安全的预处理写法(推荐)

直接拼接转义后的字符串仍然存在SQL注入风险,推荐使用MySQLi预处理语句实现相同功能:

$stmt = mysqli_prepare($con, "SELECT 
  COALESCE((SELECT SUM(amount) FROM deposits WHERE username = ?), 0)
  +
  COALESCE((SELECT SUM(amount) FROM referral WHERE username = ?), 0)
  AS value_sum");
mysqli_stmt_bind_param($stmt, "ss", $_SESSION['username'], $_SESSION['username']);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $value_sum);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
// $value_sum即为最终所求的总和

内容的提问来源于stack exchange,提问作者Pee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:06:04