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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:01:09