CodeIgniter4查询报sql_mode=only_full_group_by不兼容错误如何解决?
问题原因
sql_mode=only_full_group_by要求GROUP BY之后的所有操作(排序、返回字段等)只能使用分组键或者聚合函数计算后的结果。你当前的代码里orderBy用了原始未聚合的skift.start字段,同一vakt_id分组下存在多个skift.start值,不符合SQL规范所以触发报错。
解决方案
你已经通过selectMin计算出了每个任务对应的最早班次时间别名为sstart,直接将排序字段替换为这个聚合后的别名即可,完全符合规范,也不需要调整数据库配置。
修改后的CodeIgniter4代码如下:
public function paginatevakter(int $nb_page, int $lagID) { return $this->select('vakter.oppdrag, vakter.vakt_id') ->selectMin('skift.start', 'sstart') ->selectMax('skift.slutt', 'sslutt') ->join('skift', 'skift.vakt_id = vakter.vakt_id', 'LEFT') ->where('skift.start > now()') ->where('lag_id', $lagID) ->selectCount('skift.vakt_id', 'ant_skift') // 替换原始的skift.start为聚合后的别名sstart ->orderBy('sstart') ->groupBy('vakter.vakt_id') ->paginate($nb_page, 'show'); }
补充说明
因为vakter.vakt_id是vakter表的主键,vakter.oppdrag字段功能上完全依赖主键,所以不需要额外加到GROUP BY子句里,不会触发规则报错。如果后续需要返回更多vakter表的字段,直接在select里加即可,不需要调整GROUP BY逻辑。
内容的提问来源于stack exchange,提问作者Bengt
相关产品推荐
相关产品推荐

