MySQL分组查询报错:SELECT列表不在GROUP BY子句含非聚合列求助
问题解决:MySQL GROUP BY 报错 'SELECT list is not in GROUP BY clause and contains nonaggregated column'
这个报错是因为MySQL默认开启了ONLY_FULL_GROUP_BY模式,该模式要求SELECT语句中出现的非聚合列必须同时出现在GROUP BY子句里,或者被聚合函数(比如SUM、MIN、MAX等)包裹,否则会判定为查询逻辑不严谨,抛出错误。
你的SQL语句中,TransactionDate和TransactionTime既不在GROUP BY里,也没有用聚合函数处理,所以触发了这个错误。
解决方案
根据你的业务需求,选以下任意一种方法:
1. 将非聚合列加入GROUP BY子句(推荐,符合SQL标准)
如果同一个TransactionID对应的TransactionDate和TransactionTime是唯一的(比如每个订单ID对应唯一的交易时间),直接把这两个字段加到GROUP BY中:
let sql = 'SELECT TransactionID,SUM(Amount) as Amount,TransactionDate,TransactionTime FROM ordersdb GROUP BY TransactionID, TransactionDate, TransactionTime';
2. 用聚合函数处理非聚合列
如果同一个TransactionID对应多个不同的交易时间,但你只需要其中一个(比如最早/最晚的时间),可以用聚合函数包裹:
// 取最早的交易日期和时间 let sql = 'SELECT TransactionID,SUM(Amount) as Amount,MIN(TransactionDate) as TransactionDate,MIN(TransactionTime) as TransactionTime FROM ordersdb GROUP BY TransactionID'; // 或者取最晚的,把MIN换成MAX即可
3. 临时关闭ONLY_FULL_GROUP_BY模式(不推荐)
如果只是临时测试,不想修改SQL,可以执行以下语句关闭该模式(重启MySQL后会恢复默认设置):
SET sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
你可以在Node.js连接MySQL后先执行这条语句,再执行你的查询。
内容的提问来源于stack exchange,提问作者murtaza shah
相关产品推荐
相关产品推荐

