如何基于关联字段从数据表获取多值并计算金额总和?
解决多值分类代码的金额求和问题
首先看你的代码,核心问题出在SQL语句的IN子句部分——你直接把逗号分隔的字符串PF,HM,BP,TX放进去,数据库会把这些值当成列名而非字符串常量,这会导致语法错误或者完全不符合预期的结果。另外,为了避免SQL注入风险,也需要对每个分类代码做转义处理。
下面是修正后的完整代码,我会拆解关键步骤说明:
include "../db.php"; // 建议加上WHERE条件,明确获取permanent分组的记录(避免拿到多条结果) $a = "Select payroll_cat_name from table_2 WHERE group_name = 'permanent'"; $b = mysqli_query($con, $a); $c = mysqli_fetch_array($b); $d = $c["payroll_cat_name"]; // 把逗号分隔的字符串拆成数组 $myArray = explode(',', $d); // 处理每个分类代码:转义+包裹单引号,同时去除可能的空格 $escapedCodes = array_map(function($code) use ($con) { return "'" . mysqli_real_escape_string($con, trim($code)) . "'"; }, $myArray); // 把处理后的数组拼接成IN子句需要的格式 $codesStr = implode(',', $escapedCodes); // 执行求和查询 $tr = "SELECT SUM(amount) as am FROM table_1 WHERE category_code IN ($codesStr)"; $rt = mysqli_query($con, $tr); $new = mysqli_fetch_array($rt); $gh = $new["am"]; // 输出计算结果 echo "总金额:" . $gh;
关键修正说明:
- 给字符串值加单引号:每个分类代码都是字符串类型,必须用单引号包裹,数据库才会把它们当成字符串值处理,而不是列名。
- SQL注入防护:用
mysqli_real_escape_string对每个代码转义,防止恶意输入破坏SQL语句,这是数据库操作的基础安全习惯。 - 去除多余空格:如果原始字符串里有空格(比如
PF , HM),trim能避免因空格导致的匹配失败。 - 明确查询条件:原代码没加
WHERE,如果table_2有多条记录,mysqli_fetch_array只会取第一条,加上条件能确保拿到你需要的目标分组数据。
另外注意:TX在table_1中没有对应记录,SUM()函数会自动忽略不存在的条目,最终结果会是1000 + 12000 + 35000 = 48000,符合预期。
内容的提问来源于stack exchange,提问作者pal deepak
相关产品推荐
相关产品推荐

