MySQL 批量更新数据

来源:互联网 发布:英伟达优化软件 编辑:程序博客网 时间:2024/05/16 15:40

需求

最近做的一个项目有这个一个需求,就是记录每个消息的查看数。
规则是只要客户端调用消息列表,就把当前接口返回的数据对应的数据库里面的查看字段+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 messageSET 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的博客访问量也存在这个问题。