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