MySQL与Node Express,使用地图更新

MySQL与Node Express,使用地图更新,mysql,node.js,express,Mysql,Node.js,Express,因此,我有一个用户表,其中包括“user_id”和“points”列 现在,我想使用Map/Array[{id:1,points:2},{id:2,points:4}等..]更新多行 另一个问题是,我想添加点值,所以使用for循环构建查询字符串有点困难,因为这样我需要预先获得值 (非工作)查询(仅用于理解问题)如下所示: UPDATE users SET points = points + map[i].points WHERE id = map[i].id; 如前所述,无需添加值,我会事

因此,我有一个用户表,其中包括“user_id”和“points”列

现在,我想使用Map/Array[{id:1,points:2},{id:2,points:4}等..]更新多行 另一个问题是,我想添加点值,所以使用for循环构建查询字符串有点困难,因为这样我需要预先获得值

(非工作)查询(仅用于理解问题)如下所示:

UPDATE users SET points = points + map[i].points WHERE id = map[i].id;  
如前所述,无需添加值,我会事先创建一个字符串, 使用类似

UPDATE users SET (points) VALUES(x,y,z) WHERE id IN(a, b, c); 
但即便如此,我也不能确定更新的顺序是否与地图相同

编辑:我想在1个查询中进行编辑:)

有什么想法吗

编辑
巴兹曼的回答正是我所需要的。以下是已修复的小语法错误:

var sql = 'UPDATE users SET points = CASE id';
var i = 0;
var idString='';
map.forEach(function(item){
    sql += ' WHEN '+item.id+' THEN points + '+item.points;
    idString += item.id.toString();
    if(i < map.length-1){
        idString +=', ';
    }
    i++;
});
sql += ' END WHERE id IN('+idString+') ;';
var sql='updateusers SET points=CASE id';
var i=0;
var-idString='';
映射forEach(功能(项目){
sql+='当'+item.id+'时,然后点+'+item.points;
idString+=item.id.toString();
如果(i
编辑: 在上面的代码中,Node.js将异步执行每个循环中的查询,这在执行时间上是可以接受的

但是,如果您想使其仅为一个查询操作,则应该执行一些字符串工作

var mysql      = require('mysql');
var connection = mysql.createConnection({ user: 'root', database: 'test'});

var map = [{id:1, points:2}, {id:2, points:4}, ....];

var sql = 'UPDATE users SET points = CASE id';
var i = 0;
var idString='';
map.forEach(function(item){
    sql += ' WHEN '+item.id+' THEN points + '+item.points;
    idString += item.id.toString();
    if(i < map.length-1)
      idString +=', ';
}
sql += ' END WHERE id IN('+idString+')';

connection.query(sql, function(err, result){
  if(err)
    console.log(err);
  console.log(result.affectedRows+' rows updated!');
});
var mysql=require('mysql'); var connection=mysql.createConnection({user:'root',database:'test'}); var-map=[{id:1,points:2},{id:2,points:4},…]; var sql='updateusers SET points=CASE id'; var i=0; var-idString=''; 映射forEach(功能(项目){ sql+='当'+item.id+'时,然后点+'+item.points; idString+=item.id.toString(); 如果(i
thx,但这会产生大量的查询。我想在一个查询中完成。编辑的问题可以解决这个问题。记住,每个循环中的查询都是在Node.js中异步执行的。但是如果你真的想这样做,只需执行一个查询。我刚刚编辑了答案。谢谢!!效果很好!有一些小的语法问题,我编辑了我的问题根据您的答案和修复:)顺便说一句,我添加了I++而没有进行测试,因为它看起来是必需的,除非forEach神奇地增加它:D
var mysql      = require('mysql');
var connection = mysql.createConnection({ user: 'root', database: 'test'});

var map = [{id:1, points:2}, {id:2, points:4}, ....];

var sql = 'UPDATE users SET points = CASE id';
var i = 0;
var idString='';
map.forEach(function(item){
    sql += ' WHEN '+item.id+' THEN points + '+item.points;
    idString += item.id.toString();
    if(i < map.length-1)
      idString +=', ';
}
sql += ' END WHERE id IN('+idString+')';

connection.query(sql, function(err, result){
  if(err)
    console.log(err);
  console.log(result.affectedRows+' rows updated!');
});