如何对不同表的两列求和及相关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
相关产品推荐
相关产品推荐

