Node.js传入数组执行MySQL查询仅返回1条结果而非全部的问题
Node.js SQL IN查询仅返回第一条结果的问题分析与解决
问题原因
- 从
req.query.LocIds获取到的是字符串"125,124,126",而非数字数组。 - 原代码中
[[LocIds], custuuid]的参数传递方式,会让数据库驱动将IN条件解析为IN ('125,124,126')——把整个字符串当作单个值处理。 - 由于
LocID是数字类型,数据库会隐式将字符串'125,124,126'转换为数字125,因此仅匹配到LocID=125的记录。
解决方案
需要将字符串格式的LocIds拆分为数字数组,再正确传入查询:
1. 处理LocIds为合法数字数组
先拆分字符串,转换为数字并过滤无效值:
const locIdArray = LocIds.split(',').map(id => parseInt(id, 10)).filter(id => !isNaN(id));
2. 修正查询参数传递
直接传入数字数组,数据库驱动会自动处理IN条件的多个占位符:
let sql = "SELECT L.LocID,L.LocType,L.LocName,L.LocTitle,L.LocAddress,L.StartDate,L.EndDate,L.LocLat,L.LocLng FROM ml_locations L WHERE L.LocID IN (?) and L.CustUUID = ? Order By LocName ASC"; const [rows] = await pool.query(sql, [locIdArray, custuuid]);
完整修正代码
const { custuuid } = req.params; var LocIds = req.query.LocIds; console.log(LocIds); // LocIds = 125,124,126 // 转换为数字数组 const locIdArray = LocIds.split(',').map(id => parseInt(id, 10)).filter(id => !isNaN(id)); let sql = "SELECT L.LocID,L.LocType,L.LocName,L.LocTitle,L.LocAddress,L.StartDate,L.EndDate,L.LocLat,L.LocLng FROM ml_locations L WHERE L.LocID IN (?) and L.CustUUID = ? Order By LocName ASC"; const [rows] = await pool.query(sql, [locIdArray, custuuid]); console.log(rows); console.log("Done.");
补充说明
如果使用的是mysql2驱动,它原生支持将数组作为IN条件的参数,会自动把数组展开为对应数量的占位符(如IN (?, ?, ?)),并绑定每个数组元素的值,确保查询逻辑与手动执行的SQL一致。
内容的提问来源于stack exchange,提问作者Big Fat Designs
相关产品推荐
相关产品推荐

