Codeigniter实现名称排序数据库遇问题,请求技术协助
Codeigniter 名称排序功能修复方案
问题背景
原始数据:
- Doe Blablabla
- blablalba doe blablabla
- blablabla doe
- doe
期望排序结果(支持条数限制):
- doe
- Doe Blablabla
- blablalba doe blablabla
- blablabla doe
原代码问题分析
- 变量错误:函数参数为
$name,但模糊匹配时误用了未定义的$id,导致筛选逻辑失效 - 排序逻辑不完整:原CASE语句仅区分完全匹配、开头匹配和其他情况,未细分
$name在字符串中间、末尾的场景,无法实现期望的排序顺序 - 大小写未兼容:未处理大小写差异,导致
Doe和doe的匹配优先级不一致
修正后的代码
public function getFilter($name) { $lowerName = strtolower($name); $this->db->select("*, (CASE WHEN LOWER(people) = '$lowerName' THEN 1 WHEN LOWER(people) LIKE '$lowerName%' THEN 2 WHEN LOWER(people) LIKE '% $lowerName %' THEN 3 WHEN LOWER(people) LIKE '%$lowerName' THEN 4 ELSE 5 END) as people_name"); $this->db->from('citizen'); // 不区分大小写的模糊匹配,确保所有包含目标名称的记录被筛选 $this->db->where("LOWER(people) LIKE '%{$lowerName}%'"); $this->db->order_by("people_name asc"); $this->db->limit(2); return $this->db->get()->result(); }
修正说明
- 替换
$id为$name,修正变量引用错误 - 使用
LOWER()函数统一字符串大小写,实现不区分大小写的匹配与排序 - 细化CASE优先级:完全匹配→开头匹配→中间匹配→末尾匹配,对应权重1-4,确保排序结果符合预期
- 调整筛选条件为不区分大小写的模糊匹配,避免遗漏符合条件的记录
内容的提问来源于stack exchange,提问作者enforeach zero
相关产品推荐
相关产品推荐

