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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:52:45