【MySQL场景题:如何保障传入id顺序与查询结果id顺序一致】---项目积累
内容:记录自己学习。
文章目录
- 前言
- 一、【点赞排序显示】场景问题叙述
- 二、原因分析
- 总结
前言
今天在看一个开源项目的代码,他有一个【博客点赞排序显示的场景问题】,他牵涉到MySQL在查询的时候,自定义排序的问题,我想去记录分享一下。大家也可以看一下,感觉挺有意思的。
下面我会把具体的场景、问题,抽取出来。项目比较大,不能全部展示。
一、【点赞排序显示】场景问题叙述
我们给一个【文章】点赞,它会显示你的头像,同时它会向后端,发送这篇文章的ID、当前用户的ID、当前的时间戳。(这个头像可以记住,我们这里称为A用户)
然后我们再去登录另外一个用户B,也去点击。点赞完成之后他有一个排序的效果,但是这里就有问题,A用户第一个点赞的,他的头像应该是第一个,B用户头像应该是第二个。我们想要正确的结果应该是:A、B这样去排序,但是现在是B、A。
这里我们看一下,从后端返回的数据。后端返回的数据就是B、A的顺序,有问题!!!
我们继续看!!
我们看一下我们的Redis,id为5号在前,1号在后,没有问题!!!
再去看一下我们执行SQL日志:根据id查询用户表,先传的id为5的,也就是A用户,再去查id为1的,然后查询到2条数据,然后脱敏返回给前端渲染。
传值传的没有问题,是先5再1,为什么查出来顺序不对呢???
二、原因分析
这里直接说原因,那就是SQL语句的问题!!!这里我们用的是:where id in()
我们把这个SQL语句再去执行一下!!!如下:
当我们查询用in的时候,他不会用我们里面指定的id顺序去排序返回数据的!!! 这个时候就延伸出来一个问题,那就是在in的时候,如何保障查询的顺序,是我们传递顺序呢???
这里可以使用:ORDER BY FIELD(字段,具体顺序),这个FIELD含义就是字段,根据指定的字段,去排序。通俗来说:你想对那个字段排序,具体的顺序就是你传的顺序。如下图:
OK,这个时候,去修改一下,原有的SQL语句。
重启服务器,刷新,OK,完美!!!
OK,到这里就讲完了!!!
上面是结合特定的场景去解决这个问题的,来去具体说这个SQL的用法,当然还存在其他的解决方案。
总结
文章结合自己看别人的开源项目,总结的,如有不正确的地方,多多指教。