MySQL使用Node Express,使用Map更新UPDATE

时间:2014-05-26 13:40:47

标签: 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;  

正如我所提到的,无需添加值,我会事先创建一个String, 并使用像

这样的东西
UPDATE users SET (points) VALUES(x,y,z) WHERE id IN(a, b, c); 

但即便如此,我也无法确定更新的顺序与地图相同......

编辑:我想在1个查询中完成:)

有什么想法吗?

修改
bagz_man的回答正是我所需要的。这里修复了次要语法错误:

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+') ;';

1 个答案:

答案 0 :(得分:1)

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

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

map.forEach(function(item){
  connection.query('SELECT points FROM users WHERE id='+item.id, function(err, rows) {
    if(err)
      console.log(err);
    if(rows.length > 0){
      var newPoints = parseInt(rows[0].points) + parseInt(item.points);
      connection.query('UPDATE users SET points='+newPoints+' WHERE id='+item.id, function(err, result){
        console.log(result.affectedRows+' rows updated!');
      });
    }
    else
      console.log('No user with id:'+item.id);
  });
});

编辑: 在上面的代码中,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!');
});