CodeIgniter 4中如何为SQL查询添加临时列以筛选单条数据
解决方案
方法1:添加临时行号列(适用于需要指定某一行的场景)
利用数据库窗口函数生成统计结果的行号,避开原表ID仅对应单条原始数据的问题。以MySQL 8.0+为例,修改你的CodeIgniter 4查询代码:
$this->where('kriteria =', 'fakir'); $this->where('zona !=', '0'); // 新增临时行号列,按count降序生成行ID $this->select('ROW_NUMBER() OVER(ORDER BY count DESC) AS row_id'); $this->select('surveyor,zona,kriteria,area'); $this->selectCount('surveyor', 'count'); $this->selectSum('nilai', 'nilai'); $this->groupBy('surveyor'); $this->groupBy('kriteria'); $this->groupBy('area'); $this->orderBy('kriteria', 'ASC'); $this->orderBy('zona', 'ASC'); $this->orderBy('count', 'DESC'); // 获取第1条统计结果 $result = $this->where('row_id', 1)->get()->getRow();
这样查询结果会多出row_id列,用来标识当前统计结果的行序号,你可以通过指定row_id的值获取任意一行,完全不受surveyor字段空格的影响。
如果你的MySQL版本是5.x(不支持窗口函数),可以用自定义变量生成行号:
$this->select('@row := @row + 1 AS row_id, surveyor,zona,kriteria,area, count, nilai'); $this->selectCount('surveyor', 'count'); $this->selectSum('nilai', 'nilai'); $this->where('kriteria =', 'fakir'); $this->where('zona !=', '0'); $this->groupBy('surveyor'); $this->groupBy('kriteria'); $this->groupBy('area'); $this->orderBy('kriteria', 'ASC'); $this->orderBy('zona', 'ASC'); $this->orderBy('count', 'DESC'); // 初始化行号变量,替换your_table_name为你的实际表名 $this->from('(SELECT @row := 0) AS init, your_table_name'); $result = $this->where('row_id', 1)->get()->getRow();
方法2:直接获取结果集的指定行(简单场景首选)
如果只是需要第一条统计结果,不用额外加列,直接用CodeIgniter的内置方法:
$this->where('kriteria =', 'fakir'); $this->where('zona !=', '0'); $this->select('surveyor,zona,kriteria,area'); $this->selectCount('surveyor', 'count'); $this->selectSum('nilai', 'nilai'); $this->groupBy('surveyor'); $this->groupBy('kriteria'); $this->groupBy('area'); $this->orderBy('kriteria', 'ASC'); $this->orderBy('zona', 'ASC'); $this->orderBy('count', 'DESC'); // 直接取第一条结果 $result = $this->get()->first();
要是需要获取第N条,可以先拿到所有结果再通过数组索引取值:
$allResults = $this->get()->getResult(); // 取第2条(数组索引从0开始) $specificRow = $allResults[1] ?? null;
内容的提问来源于stack exchange,提问作者Junk_Warior
相关产品推荐
相关产品推荐

