在Mysql中有些场景要在group by 中不对 null 数据做分组
场景示例:
在网络上解决方式都是用
GROUP BY IFNULL(字段,UUID())
这种方式来排除null数据的合并分组
UUID():此函数是生成唯一的ID值,通常用来生成主键
IFNULL(A,B): 如果A是空的那么IFNULL的结果就是B,反之A不为空那么IFNULL的结果就是A
IFNULL()与UUID()组合使用就可以在group by分组时将null空数据生成一个唯一的ID,这样一来,每个null数据都会有一个唯一的ID,就不会合并在一起了。
但是!!!!
我们在Mysql执行一下
GROUP BY IFNULL(字段,UUID())
这种方式发现:
我们在Mysql使用
GROUP BY IFNULL(字段,UUID())
时会没有效果,这是为什么呢?
经过一番研究因为在使用
IFNULL(字段,UUID())
时UUID()生成的ID值都是一样的,所以没有效果
为什么使用UUID()生成的ID都是一样?
我在网络上找到了很多种解释:
有的说Mysql字符集出了问题,要将Mysql字符集修改成UTF-8的;
参考链接:
https://blog.csdn.net/weixin_42514562/article/details/113233270
有的说是navicat工具上显示id 重复 而在MySQL Client可以正常执行,是navicat工具有问题;
有的直接给出了解决方案,就是UUID()用MD5()包起来,就是写成
IFNULL(字段,MD5(UUID()))
前两种解决方案我都尝试过发现没有作用,最后一种解决方案把
IFNULL(字段,UUID())
换成
IFNULL(字段,MD5(UUID()))
之后在mysql执行成功了
证明此方法有效,所以就将
IFNULL(字段,MD5(UUID()))
放到了Mybatis的xml中使用了
注意!!!!
很奇怪的是,在Mybatis执行却不生效,输出的语句确实是正确的,但是在Mybatis执行还是会把null合并在一起了,没有将null数据通过UUID()生成唯一的ID分开。
最后解决方案!!!!
通过一番尝试,将MD5(UUID())改成了UUID_SHORT(),则写成
IFNULL(字段, UUID_SHORT())
UUID_SHORT()
:与UUID()一样,只不和UUID()返回的长度字符串不同
最后问题解决,如果你项目中使用了Mysql和Mybatis,然后也碰到了group by 中不对 null 数据做分组的需求,就直接用
GROUP BY IFNULL(字段, UUID_SHORT())
即可!