MySQL错误1054:LEFT JOIN多表查询on clause出现未知列'2021-08-23'问题
错误原因
- 核心触发点是拼接SQL时没有给日期值加单引号,MySQL将
2021-08-23这类日期字面量识别为字段名,因此抛出1054字段不存在错误。 - 从提供的PHP代码可见,关联
isn表的ON条件中,直接将处理后的日期字符串拼接到语句中,没有包裹字符串必需的单引号,MySQL无法将其识别为参数值,默认按照标识符(列名)解析,最终报错。
修复方案
你目前将日期筛选条件写在LEFT JOIN的ON子句中逻辑是正确的,不需要调整位置(如果移到WHERE子句会导致LEFT JOIN退化为INNER JOIN,丢失没有匹配isn表记录的投诉单数据),仅需要修正日期参数的拼接方式即可,两种方案可选:
方案1:手动添加单引号(快速修复)
直接在日期变量的拼接位置前后补充单引号:
$this->db->JOIN('isn as i', 'i.isn_Complain_Number = c.complaint_Job_No AND i.isn_Add_Date BETWEEN "'.str_replace('/', '-', $fromDate).'" AND "'.str_replace('/', '-', $toDate).'"', 'LEFT');
方案2:使用框架转义(更安全,避免SQL注入)
调用CodeIgniter查询构造器的escape方法自动处理引号和特殊字符转义:
$fromDateProcessed = str_replace('/', '-', $fromDate); $toDateProcessed = str_replace('/', '-', $toDate); $joinCondition = sprintf( 'i.isn_Complain_Number = c.complaint_Job_No AND i.isn_Add_Date BETWEEN %s AND %s', $this->db->escape($fromDateProcessed), $this->db->escape($toDateProcessed) ); $this->db->JOIN('isn as i', $joinCondition, 'LEFT');
内容的提问来源于stack exchange,提问作者Laraib
相关产品推荐
相关产品推荐

