MySQL使用union导致数据丢失的解决办法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL使用union导致数据丢失的解决办法相关的知识,希望对你有一定的参考价值。
参考技术A 最近在做报表统计的时候碰到一个诡异的bug,union左边查出来有4条数据,右边是0条,理论上最后的结果有4条,但是执行结果很意外,只有三条。最后的解决办法是在查询数据列加上了各自的报表时间。
原始sql:
改正后:
union在做一些数据合并统计的时候很有用,但稍不注意就会踩坑导致数据丢失统计出错。
使用union时一定要注意union自带了去重功能,而且机制类似于 把左右两边的数据完全做完合并再来一个distinct,所以一旦有两行的数据一模一样时,union会去掉这些重复行,即使这些重复行只是存在于其中一个结果集的 。
union all的机制类似于把左右两边的数据完全做完合并,并且不会做去重。虽然可以使用union all就不会做去重,但是试想一下这个需求:如果我们需要把左结果集和右结果集的数据做合并,但是左结果集和右结果集存在一些重复,这种重复数据是应该去掉的,而左结果集和右结果集自身存在的重复行是应该保留的,因为我们的目的并不是在每个结果集做去重,而是保证union的左边数据不和右边数据重复。建议认真考虑使用场景再决定是否使用union all。
union去重时去掉的重复数据如果是我们需要保留的,因为他们并不是来自于同一行,只是因为值完全一致而被去掉了,那么应该把这些数据的唯一标志也放在查询列,这样就不是重复数据了。
跨域请求,关于后端session会话丢失的解决办法
目前使用前后端分离的模式开发,后端提供跨域接口、前端jsonp调用,绑定数据,但是在该站点下有个人中心模块存在的情况下,服务端的session会话会被跨域请求覆盖改掉
大家都知道tomcat使用cookie中jsessionid来区分客户端session会话
跨域请求接口恰恰有时候响应回来回改变该站点下的jsessionid值,导致服务器每次判断都是一个新的会话
以网站个人中心模块来说,每一个跨域jsonp请求,都会Response 一个cookie值,SET-COOKIE:JSESSIONID=XXXX,如下图:
再看服务端,前端刷新一次也没,后端服务会话id都不是同一个sessionid,所有后端所有的请求都是未登录,这就导致前端发送的请求,后端无法拿到当前个人用户信息
目前服务端部署都采用tomcat,所以修改办法是在conf/context.xml文件中,设置sessionId的cookieName别名,不和默认的jsessionid一直,如下:
最终修改好后,再看服务器的cookie值,服务端使用session取的cookie值是刚刚设置的别名cookie值SHGJSESSIONID,所以不受跨域接口影响
最终服务端请求的session会话能保证是同一个,所以也能取到当前登录的个人信息
更多tomcat参数设置值请参考 tomcat-context参数值
以上是关于MySQL使用union导致数据丢失的解决办法的主要内容,如果未能解决你的问题,请参考以下文章