Laravel中SQL 1055报错:chart_of_accounts.name未在GROUP BY中
解决MySQL ONLY_FULL_GROUP_BY导致的SQL报错问题
问题原因
你遇到的1055 'new.chart_of_accounts.name' isn't in GROUP BY错误,是因为MySQL开启了ONLY_FULL_GROUP_BY模式——这个模式要求SELECT语句中所有非聚合函数的字段必须出现在GROUP BY子句里。你的查询里选了chart_of_accounts.name,但只按account分组,违反了这个规则。
解决方案
方案1:把非聚合字段加入GROUP BY(推荐,符合SQL标准)
如果journal_items.account和chart_of_accounts.name是一一对应的(一个账户ID对应唯一的账户名称),直接把chart_of_accounts.name也加到GROUP BY里即可:
修改代码中的分组行:
$journalItem->groupBy('journal_items.account', 'chart_of_accounts.name');
方案2:用聚合函数包裹非聚合字段
如果能确保同一个account对应的name不会有多个值,可以用MAX()或MIN()这类聚合函数包裹chart_of_accounts.name,让它符合聚合查询的规则:
修改SELECT部分的代码:
$journalItem = JournalItem::select( \DB::raw('MAX(chart_of_accounts.name) as name'), // 用MAX包裹name,并重命名为name \DB::raw('sum(credit) as totalCredit'), \DB::raw('sum(debit) as totalDebit'), \DB::raw('sum(credit) - sum(debit) as netAmount') );
方案3:临时关闭ONLY_FULL_GROUP_BY(不推荐,仅临时应急)
如果不想修改查询逻辑,可以临时关闭当前连接的ONLY_FULL_GROUP_BY模式,但这会绕过SQL标准校验,可能导致数据不准确,不建议长期使用:
在查询执行前添加这段代码:
// 临时关闭ONLY_FULL_GROUP_BY \DB::statement("SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));"); // 下面是你的原有查询代码 $journalItem = JournalItem::select(...); // ... 后续查询逻辑不变
内容的提问来源于stack exchange,提问作者Imran Niaz
相关产品推荐
相关产品推荐

