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

CPanel虚拟主机下SQL GROUP BY模式报错1140求助

解决MySQL错误1140(only_full_group_by兼容问题)

核心原因

关闭strict模式无法解决这个问题——strict和only_full_group_by是MySQL中两个独立的SQL模式项:strict控制的是字段严格校验规则(比如非空字段插入空值的报错),而only_full_group_by强制要求聚合查询中,SELECT列表里的非聚合列必须出现在GROUP BY子句中,两者互不影响。

解决方案

方案1:添加GROUP BY子句(推荐,逻辑更严谨)

如果你的需求是按货币类型分别统计总支付金额,给查询添加GROUP BY子句即可:

修改后的PHP代码:

public function get_payment_info(){
    $ret = '';
    $query=$this->db->select('sum(fee) as paid_amt, currency_code')
        ->from('subscription_details_history as s')
        ->join('subscription_fee as f','f.id=s.subscription_id')
        ->group_by('f.currency_code') // 新增GROUP BY子句
        ->get();

    if($query !== FALSE && $query->num_rows() > 0){
        $ret = $query->result_array();
    }
    return $ret;
 }

对应的SQL语句:

SELECT sum(fee) as paid_amt, `currency_code` 
FROM `subscription_details_history` as `s` 
JOIN `subscription_fee` as `f` ON `f`.`id`=`s`.`subscription_id`
GROUP BY `f`.`currency_code`

方案2:用ANY_VALUE()函数绕过校验(适合所有记录货币相同的场景)

如果所有关联的subscription_id对应的currency_code完全一致,不需要分组统计,可使用ANY_VALUE()包裹非聚合列,告知MySQL允许选择任意一个符合条件的值:

修改后的PHP代码:

public function get_payment_info(){
    $ret = '';
    $query=$this->db->select('sum(fee) as paid_amt, ANY_VALUE(currency_code) as currency_code')
        ->from('subscription_details_history as s')
        ->join('subscription_fee as f','f.id=s.subscription_id')
        ->get();

    if($query !== FALSE && $query->num_rows() > 0){
        $ret = $query->result_array();
    }
    return $ret;
 }

对应的SQL语句:

SELECT sum(fee) as paid_amt, ANY_VALUE(`currency_code`) as `currency_code`
FROM `subscription_details_history` as `s` 
JOIN `subscription_fee` as `f` ON `f`.`id`=`s`.`subscription_id`

内容的提问来源于stack exchange,提问作者Md Faruk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:15:59