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

MySQL正常运行的SQL查询在Laravel查询构建器中报错求助

解决Laravel查询构建器GROUP BY报错(SQLSTATE[42000]: 1055)

问题根源

你的原生SQL在phpMyAdmin/控制台能运行,是因为该环境下的MySQL未开启only_full_group_by严格模式;而Laravel默认连接的MySQL启用了该模式,要求SELECT语句中所有非聚合列必须出现在GROUP BY子句中,或与分组键存在函数依赖关系。


解决方案

方案1:修正GROUP BY子句,包含所有非聚合列

将SELECT中所有未使用聚合函数的字段全部加入GROUP BY,确保分组逻辑符合MySQL严格模式要求:

DB::table('clients')
->select('clients.name', 'clients.address_1', 'client_contacts.family_name',
  'client_contacts.given_name', 'client_contacts.office_country', 
  'client_contacts.office_city', 'client_contacts.office_number', 
  'client_contacts.position', 'contact_titles.description')
->join('client_contacts','clients.entry','=','client_contacts.client')
->join('contact_titles','client_contacts.title','=','contact_titles.code')
->groupBy(
    'clients.entry', 
    'clients.name', 
    'clients.address_1', 
    'client_contacts.family_name',
    'client_contacts.given_name', 
    'client_contacts.office_country', 
    'client_contacts.office_city', 
    'client_contacts.office_number', 
    'client_contacts.position', 
    'contact_titles.description'
)
->orderBy('clients.entry','asc')
->get();

方案2:对非聚合列使用聚合函数

如果业务逻辑允许每个client仅取一条关联的contact记录,可以用MySQL特有的ANY_VALUE()或通用聚合函数(如MIN()/MAX())包裹非分组字段:

DB::table('clients')
->select(
    'clients.name', 
    'clients.address_1', 
    DB::raw('ANY_VALUE(client_contacts.family_name) as family_name'),
    DB::raw('ANY_VALUE(client_contacts.given_name) as given_name'),
    DB::raw('ANY_VALUE(client_contacts.office_country) as office_country'),
    DB::raw('ANY_VALUE(client_contacts.office_city) as office_city'),
    DB::raw('ANY_VALUE(client_contacts.office_number) as office_number'),
    DB::raw('ANY_VALUE(client_contacts.position) as position'),
    DB::raw('ANY_VALUE(contact_titles.description) as description')
)
->join('client_contacts','clients.entry','=','client_contacts.client')
->join('contact_titles','client_contacts.title','=','contact_titles.code')
->groupBy('clients.entry', 'clients.name', 'clients.address_1')
->orderBy('clients.entry','asc')
->get();

方案3:临时关闭only_full_group_by模式(不推荐)

修改Laravel数据库配置文件config/database.php,在mysql配置中移除ONLY_FULL_GROUP_BY模式:

'mysql' => [
    // ...其他配置项
    'modes' => [
        'STRICT_TRANS_TABLES',
        'NO_ZERO_IN_DATE',
        'NO_ZERO_DATE',
        'ERROR_FOR_DIVISION_BY_ZERO',
        'NO_ENGINE_SUBSTITUTION',
    ],
],

注意:该方法会降低数据一致性校验,仅适合临时调试,不建议生产环境使用。


内容的提问来源于stack exchange,提问作者fat penguin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:42:37