Node.js中如何提取MySQL COUNT分组查询返回的计数值
Node.js获取MySQL COUNT聚合结果的正确方法
问题复现
在Node.js项目中统计tweet_replies表每个conversation_id对应的记录行数时,执行分组聚合查询:
const numOfReplies = await SQL('SELECT COUNT(conversation_id), conversation_id FROM tweet_replies GROUP BY conversation_id')
遍历结果集打印单条数据结构如下:
{ 'COUNT(conversation_id)': '10', conversation_id: '1530169643423367169' }
无法直接通过点语法拿到COUNT对应的统计值。
解决方案
方案1(推荐):SQL查询时给聚合字段加别名
这是最规范的处理方式,在写SQL时用AS给聚合计算的字段起语义化别名,返回结果会直接用别名作为对象键名,方便取值:
// 修改SQL,给COUNT结果加别名reply_count const numOfReplies = await SQL('SELECT COUNT(conversation_id) AS reply_count, conversation_id FROM tweet_replies GROUP BY conversation_id') // 遍历取值 numOfReplies.forEach(num => { // 注意:MySQL驱动默认返回的计数是字符串类型,需要数值的话手动转换 const replyCount = Number(num.reply_count) const conversationId = num.conversation_id console.log(conversationId, replyCount) })
方案2:直接通过原始键名取值
如果暂时无法修改SQL语句,可以直接用返回结果里的完整键名取值,注意键名包含特殊字符,不能用点语法,要用方括号语法读取:
numOfReplies.forEach(num => { // 方括号内写完整的原始键名,同样注意类型转换 const replyCount = Number(num['COUNT(conversation_id)']) console.log(replyCount) })
注意:Node.js的MySQL驱动默认会把数据库返回的数值类型字段转成JavaScript字符串,避免大整数精度丢失,如果后续要做数值运算,一定要手动转成Number类型再使用。
内容的提问来源于stack exchange,提问作者Edin Osmic
相关产品推荐
相关产品推荐

