如何用CodeIgniter Active Record实现多表LIKE模糊查询?
解决多表模糊查询的CodeIgniter Active Record写法
首先,你的问题根源在于WHERE子句里用错了运算符——||在大多数SQL方言中是字符串拼接运算符,而非逻辑“或”(OR)。这导致你的条件判断完全偏离预期:它把两个LIKE判断的结果(0或1)拼接成字符串,非空的拼接结果被当作true,所以连Sumatera Utara这种state_name不含"si"的记录也被返回,同时还漏掉了India的Gujarat(因为逻辑判断根本没生效)。
正确的CodeIgniter Active Record 查询代码
// 构建查询 $this->db->select('tc.country_name, ts.state_name'); $this->db->from('STATE ts'); // 使用INNER JOIN,因为我们需要关联有效国家的州记录 $this->db->join('COUNTRY tc', 'tc.id = ts.country_id', 'INNER'); // 包裹OR条件,确保逻辑范围正确 $this->db->group_start(); $this->db->like('ts.state_name', 'si'); $this->db->or_like('tc.country_name', 'si'); $this->db->group_end(); // 执行查询并获取结果 $query = $this->db->get(); $result = $query->result();
对应的原生SQL(供参考)
SELECT tc.country_name, ts.state_name FROM STATE ts INNER JOIN COUNTRY tc ON tc.id = ts.country_id WHERE ts.state_name LIKE '%si%' OR tc.country_name LIKE '%si%'
关键说明:
- 逻辑修正:用
or_like替代错误的||,实现正确的“或”逻辑判断。 - 条件分组:
group_start()和group_end()用来包裹OR条件,避免后续添加其他AND条件时出现逻辑混乱(这是编写复杂查询的良好习惯)。 - JOIN优化:使用
INNER JOIN而非LEFT JOIN,因为我们只需要存在关联国家的州记录,完全匹配你的期望结果场景;如果需要包含无州的国家,再改用LEFT JOIN。 - 字段精简:只选择你需要的
country_name和state_name,避免返回多余字段,和你期望的输出结构完全一致。
执行该查询后,会得到你想要的结果:
| country_name | state_name |
|---|---|
| Indonesia | Sulawesi Selatan |
| Indonesia | Sulawesi Tengah |
| India | Gujarat |
内容的提问来源于stack exchange,提问作者Sachin Sanchaniya
相关产品推荐
相关产品推荐

