MySQL 批量更新数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuming3834/article/details/78549211

需求

最近做的一个项目有这个一个需求,就是记录每个消息的查看数。
规则是只要客户端调用消息列表,就把当前接口返回的数据对应的数据库里面的查看字段+1。做的是后端给前端一次返回20条数据,那么就存在,后端需要一次跟新这20条记录的查看数。这就是设计到MySQL的批量更新操作了。

实现

消息表message:

id content see
1 今天天气不错 222
2 马上要过年了 123
3 嘿嘿 234

数据分页

一次获取20条消息,且根据查看数see排序:index是位置偏移,这个和分页参数有关:

// 计算偏移
var index = (page - ) * 20;
// sql语句
select * from message order by see desc limit index,20;
请求接口
http://xxxx.cn?page=1
接口返回json
{
    status: 100,
    msg: "操作成功",
    data: [
        {
            id: 3,
            content: "嘿嘿",
            see: 234
        },
        {
            id: 1,
            content: "今天天气不错",
            see: 222
        },
        {
            id: 2,
            content: "马上要过年了",
            see: 123
        },
    ]
}

批量更新

这是正常情况的返回。但是这里没做查看数+1的操作。
那么现在又这个么多是数据需要做查看数+1的操作也就是批量更新这些数据的see数据。
就是下面这一条sql语句了,也就是说把id为1,2,3的阅读量+1;

UPDATE message
SET see = CASE id 
     WHEN 1 THEN 3 
     WHEN 2 THEN 4 
     WHEN 3 THEN 5 
 END
 WHERE id IN (1,2,3);

这个SQL只是示例,在node.js里面怎么处理呢?

var len1 = data.length;
var caseSQL = '';
var ids = '';
for (var i = 0; i < len1; i++) {
    var element = data[i];
    caseSQL = caseSQL + ' when ' + element.id + ' then ' + (element.see + 1) + ' ';
    ids = ids + element.id + ',';
}
// 去掉最后一个","
ids = ids.substring(0,(ids.length - 1));
// 拼接SQL 语句
var upadteSQL = 'UPDATE message set see = CASE id '
                + caseSQL
                + ' END '
                + ' WHERE id in (' + ids + ')';  

在执行完这个SQL之后,表中的那些数据的see字段就+1了。

步骤

具体下来就是:
1。先获取接口需要返回的数据
2。批量跟新数据库中的see字段
3。json返回给前端
但是这样 就存在一个问题,用户可以刷消息查看量,只要他请求这个接口,就会自动+1。但在实际中发现CSDN的博客访问量也存在这个问题。

猜你喜欢

转载自blog.csdn.net/zhuming3834/article/details/78549211