PHP/MySQL 如何使用SUM聚合计算结果关联查询另一张表
问题原因
MySQL的语句执行顺序为:FROM/JOIN → WHERE → GROUP BY → 聚合计算 → HAVING → SELECT → ORDER BY
你定义的temphf是聚合计算后生成的别名,在执行JOIN的阶段还没有生成,所以会报未知列错误。
解决方案1:使用派生表(子查询,兼容所有MySQL版本)
先通过子查询提前计算tempimport的聚合结果,再和hf表关联,示例代码如下:
$stateKdnr = $pdo->prepare(" SELECT t.*, hf.* FROM ( SELECT *, COUNT(csv_kd_nr) AS cnt, SUM(csv_betrag) as temphf FROM tempimport WHERE csv_zeilenstatus != 'done' GROUP BY csv_kd_nr, csv_name, csv_ort, csv_vorname ) AS t INNER JOIN hf ON t.temphf BETWEEN hf.von_hf AND hf.bis_hf ");
解决方案2:使用CTE(仅支持MySQL 8.0+,可读性更好)
$stateKdnr = $pdo->prepare(" WITH temp_agg AS ( SELECT *, COUNT(csv_kd_nr) AS cnt, SUM(csv_betrag) as temphf FROM tempimport WHERE csv_zeilenstatus != 'done' GROUP BY csv_kd_nr, csv_name, csv_ort, csv_vorname ) SELECT temp_agg.*, hf.* FROM temp_agg INNER JOIN hf ON temp_agg.temphf BETWEEN hf.von_hf AND hf.bis_hf ");
注意事项
你原有写法中的关联条件von_hf > temphf AND bis_hf < temphf逻辑错误,无法匹配到任何数据。如果需要实现「temphf的值介于von_hf和bis_hf之间」的规则,请使用上文示例中的BETWEEN语法,若不需要包含边界值,可改为temp_agg.temphf > hf.von_hf AND temp_agg.temphf < hf.bis_hf。
内容的提问来源于stack exchange,提问作者Pizzucu
相关产品推荐
相关产品推荐

