跨MySQL数据库同表Union汇总查询语法报错,求排查修正
问题分析与修正
你的SQL语句和CodeIgniter代码存在以下几个关键问题:
1. 重复的SELECT关键字
外层查询开头写了select,紧接着又嵌套SELECT finance_vote.vote...,属于语法冗余,直接触发SQL解析报错。
2. 字段别名重复定义
子查询里的SUM(amount) AS amount AS amt_2022是错误写法,一个字段只能用一次AS指定别名,这里无需重复定义。
3. 数据库连接对象误用
$otherdb2022是CodeIgniter返回的数据库连接实例,不是数据库名称字符串,直接拼入SQL会导致SQL中出现无效的对象字符(比如Object),正确做法是直接使用数据库名2022_db和2023_db指定跨库表。
4. 字段表名引用错误
子查询里写的finance_vote.vote,但实际查询的表是finance_budget_issue,应改为finance_budget_issue.vote(若vote字段属于该表),否则会出现表/字段不存在的错误。
修正后的代码
public function amt_tot() { $q = $this->db->query(" SELECT vote, SUM(amount) AS total_amount FROM ( SELECT vote, SUM(amount) AS amount FROM 2022_db.finance_budget_issue GROUP BY vote UNION ALL SELECT vote, SUM(amount) AS amount FROM 2023_db.finance_budget_issue GROUP BY vote ) AS tot GROUP BY vote "); if ($q->num_rows() > 0) { return $q->result(); } return []; // 无数据时返回空数组更规范 }
额外说明
- 若
vote字段确实来自关联的finance_vote表,需在子查询中添加JOIN逻辑,但根据需求描述,应直接从finance_budget_issue表读取该字段。 - 使用
UNION ALL而非UNION是正确选择,无需去重,保留所有年度汇总结果后再二次汇总。
内容的提问来源于stack exchange,提问作者MCIT Trends
相关产品推荐
相关产品推荐

