You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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_namestate_name
IndonesiaSulawesi Selatan
IndonesiaSulawesi Tengah
IndiaGujarat

内容的提问来源于stack exchange,提问作者Sachin Sanchaniya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:15:22