MySQL Node.js中的IN子句

23
我有一个简单的Node.js应用程序,它执行以下查询。
select * from User where userid in (?)

我从客户端接收到一个JSON数组,如何在这个查询中使用这些用户ID?我尝试了以下两种方法: 1. 直接使用,但是不起作用。 2. 转换成JavaScript数组,还是不行。


2
分享代码。 - Mukesh Sharma
你可以这样做:选择*从用户中,其中userid在(?,?,?,?)。 - Md.Alauddin Hossain
8个回答

36

如果您正在使用像mysql这样的节点模块,则第二种方法应该有效。

var query=select * from User where userid in (?);
var data=['a','b','c'];
var queryData=[data];

conn.query(query, queryData, function (err, results) {})
根据文档,“数组会被转换为列表,例如 ['a', 'b'] 会变成 'a', 'b'”。因此这种方法应该可行(我已经实际使用过它)。

当参数为[5,[17,22,67,85,105,161,166,170,180,197,198]]或[5,["17","22","67","85","105","161","166","170","180","197","198"]]时,我实际上有“mysqld_stmt_execute的错误参数”。查询以WHERE tto.tariff_id =?AND so.service_opt_id IN(?)结束,这些是唯一的问号。 - Daniele Cruciani

6
如果您将一个数组传递给参数,它可以与 node 的 mysql2 进行交互。参数已经以数组的形式传递,因此您的第一个参数需要是一个数组 [[1,2,3]]
select * from User where userid in (?)

const mysql = require('mysql2/promise');

async function main(){
  let db = await mysql.createPool(process.env.MYSQL_URL);
  let SQL = 'select * from User where userid in (?)';

  let [res, fields] = await db.query(SQL, [[1,2,3]]);
  console.log(res)
  return res;
}

main().then(() => {process.exit()})

为什么我的代码不工作?它应该可以工作的。这让我很抓狂。 - GeekLei

1

重新审视此问题,原始方法是有效的,但有一些注意事项。如果您唯一需要转义的参数是IN子句中的参数,则必须将其指定为嵌套数组; 类似于:[['usrId1','usrId2','usrIdN']]。这是因为非转义功能期望一个数组,用相应的数组元素替换每个“?”。因此,如果您想用数组替换唯一的“?”,那么该数组应该是传递的所有参数的第一个元素。如果您有多个“?” ,语法更直观,但最终一致且相同; 在这种情况下,您可以使参数类似于:['myOtherArgument1','myOtherArgument2',['usrId1','usrId2','usrIdN'],'myOtherArgument3']


1
像这样的东西可能有效!
// get your possible IDs in an array
var ids = [1,2,3,4,5];

// then, create a dynamic list of comma-separated question marks
var tokens = new Array(ids.length).fill('?').join(',');

// create the query, passing in the `tokens` variable to the IN() clause
var query = `SELECT * FROM User WHERE userid IN (${tokens})`;

// perform the query
connection.query(query, ids, (err, data) => {
   // do something with `err` or `data`
});

0

更新:请参见此答案。这是问题所要求的正确方法。

我尝试过的方法有:

  1. 将JSON数组扩展为所需格式的字符串。使用“+”将其与查询连接起来。(注意SQL注入)
  2. 根据保存用户ID的JSON数组的长度动态添加“?”。然后使用该数组提供用户ID。

两种方法都有效。然后,我改变了我的逻辑,采用更好的方法,现在我不再需要“in”子句了。


我也是这么想的。抱歉,我忘了在回答中加上那个。这就是为什么我改变了我的方法。 - Jithin Sebastian

0
你可以这样做: select * from User where userid in (?,?,?,?)
var array = []; 
array.push(value);
array.push(value);
array.push(value);
array.push(value);

然后使用数组作为参数,应该进行绑定。


1
这对于大小固定的数组很好,但如果大小可以变化呢? - Aaron
你必须动态地添加“?”,因为我在我的项目中使用了它。 - Md.Alauddin Hossain
我将JSON数组扩展为所需格式的字符串,然后与查询字符串连接。这种方法不好吗? - Jithin Sebastian

0

// 用逗号获取查询字符串数据 var param=req.params['ids'];

//damy data var param = [1,2,3,4,5];

var array = params.split(",").map(Number);

//注意在select查询中不要使用 "和'(引号和撇号)
//只需使用` (重音符号),键盘上数字键的第一个键位在其前面

con.query(`select * from TB_NAME where COL IN(?)`,[array],(err,rows,fields)=>{

res.json(rows); });


为了帮助 OP 解决当前的问题,可以在答案中添加一些解释说明。 - ρяσѕρєя K

0
let val = ["asd","asd"]
let query = 'select * from testTable where order_id in (?)';
connection.query(query, [val], function (err, rows) {
});

在Node中,你需要把数组放入数组中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接