CodeIgniter中MySQL按特定值排序失败:CASE语句不生效求助
解决CodeIgniter中CASE表达式排序失效的问题
嘿,我来帮你搞定这个排序的问题!你遇到的情况其实是CodeIgniter查询构造器的默认行为导致的——它会自动给order_by里的字段名加上反引号做转义,但你的CASE语句是一个自定义的SQL表达式,不是普通的表字段,转义之后MySQL就没法正确解析这个逻辑了。
直接修复方案
只需要给第二个order_by调用加上第三个参数FALSE,告诉CodeIgniter不要转义这个表达式就行:
$this->db->select('*'); $this->db->from('Questions'); $this->db->where('Questions.Status !=', 0); $this->db->order_by('IdQuestion', 'DESC'); // 添加第三个参数FALSE,禁用自动转义 $this->db->order_by('(CASE WHEN Status = 3 THEN 1 ELSE 2 END)', 'DESC', FALSE);
更清晰的优化写法
你也可以把这个CASE表达式放到select语句里,给它起一个别名,然后用别名来排序,这样代码可读性更高,还能顺便拿到这个排序标识:
$this->db->select('*, (CASE WHEN Status = 3 THEN 1 ELSE 2 END) AS sort_order'); $this->db->from('Questions'); $this->db->where('Questions.Status !=', 0); $this->db->order_by('IdQuestion', 'DESC'); $this->db->order_by('sort_order', 'DESC');
这样修改后,查询结果里会多一个sort_order字段,值是1或者2,方便你后续如果需要用到这个排序依据的话直接取用,逻辑也更直观。
内容的提问来源于stack exchange,提问作者danplaton4
相关产品推荐
相关产品推荐

