所以我有一个用户表,其中包括'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+') ;';
答案 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!');
});