如何在SQL及Sequelize中使用GROUP BY?GROUP BY报错咨询
解决SQL及Sequelize中GROUP BY的使用问题
错误原因
SQL的GROUP BY语法规则明确:SELECT子句中出现的非聚合列,必须全部包含在GROUP BY子句中。你原查询里SELECT了id、company_number,但GROUP BY仅指定了country_code,不符合规则,因此触发错误。
原生SQL的正确写法
根据实际需求,分两种场景处理:
场景1:按country_code分组,聚合其他列
如果需要对id、company_number进行聚合计算(比如取最大值、最小值),用聚合函数包裹这些列:
SELECT MAX([id]) AS max_id, MAX([company_number]) AS max_company_number, [country_code] FROM [core].[company] WHERE [core].[company].[id] IN (N'DK-10001560') GROUP BY [country_code]
场景2:保留所有查询列的分组
如果你的WHERE条件已经限定了单条唯一记录(id通常是主键),或者需要按所有查询列分组,将id、company_number也加入GROUP BY:
SELECT [id], [company_number], [country_code] FROM [core].[company] WHERE [core].[company].[id] IN (N'DK-10001560') GROUP BY [id], [company_number], [country_code]
Sequelize中的实现
Sequelize严格遵循SQL的GROUP BY规则,对应上述两种场景的写法如下:
场景1:聚合查询
const { Op } = require('sequelize'); const Company = require('./models/company'); // 替换为你的模型路径 async function getGroupedCompanies() { const result = await Company.findAll({ attributes: [ [Company.sequelize.fn('MAX', Company.sequelize.col('id')), 'max_id'], [Company.sequelize.fn('MAX', Company.sequelize.col('company_number')), 'max_company_number'], 'country_code' ], where: { id: { [Op.in]: ['DK-10001560'] } }, group: ['country_code'] }); return result; }
场景2:全列分组
const { Op } = require('sequelize'); const Company = require('./models/company'); // 替换为你的模型路径 async function getGroupedCompanies() { const result = await Company.findAll({ attributes: ['id', 'company_number', 'country_code'], where: { id: { [Op.in]: ['DK-10001560'] } }, group: ['id', 'company_number', 'country_code'] }); return result; }
内容的提问来源于stack exchange,提问作者Vyacheslav Tarshevskiy
相关产品推荐
相关产品推荐

