关于MySQL递归查询GROUP_CONCAT返回值长度设置问题

一、描述

今天遇到一个mysql递归查询的问题,统计的数量和分页的数量对应不上,分页采用的是数据库递归查询的方法。问题思路:
1、统计sql问题或递归查询sql问题。
2、发现表没设置主键id(这脑子。。。),猜想是id重复问题。
经过多方验证是递归查询函数的问题,返回的字符串(逗号隔开的id)末尾总是少一半;猜想返回值大小太小,增加了返回值的大小后还是不对;继续查找原因,发现返回值有GROUP_CONCAT这个函数,猜想是不是这个函数的值太小了,导致返回的数据变少,百度了一下果然是的,坑爹啊。。。下面记录设置GROUP_CONCAT大小方法:

二、设置GROUP_CONCAT大小

第一种方法:
查看当前mysql group_concat_max_len的大小(不设置一般是1024);

SELECT @@global.group_concat_max_len;

在这里插入图片描述
我这个是修改过后的结果;1024这就是一般MySQL系统默认的最大长度,如果你的id串起来大于这个就会出问题,解决的办法:

1、直接sql执行设置语句

SET GLOBAL group_concat_max_len=102400;

这个sql我用navcat执行后结果是变了,但是执行递归返回的还是不对,一般来说sql设置是不用重启mysql服务的,我重启了一下发现结果又变回了1024,笑哭23333.。。。。

2、直接设置mysql配置文件my.ini

如果没有就新增配置:group_concat_max_len = 102400

然后重启mysql服务;在执行递归查询终于正常了。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用MyBatis的递归查询实现树形结构的查询。具体步骤如下: 1. 定义实体类 定义一个实体类,表示树的节点,包含节点id、父节点id、节点名称等属性。 2. 定义Mapper接口 定义一个Mapper接口,包含一个方法,用于查询树形结构的节点。方法的返回值为List集合,表示查询到的树形结构的节点。 3. 编写Mapper.xml配置文件 在Mapper.xml配置文件中,编写递归查询语句,通过查询语句实现树形结构的查询。具体实现方式如下: - 定义一个select语句,用于查询指定节点的所有子节点。 - 在select语句中,使用union all关键字连接多个子查询语句,实现递归查询。 - 在子查询语句中,使用with recursive关键字定义递归查询语句。 4. 调用Mapper接口 在Java代码中,调用Mapper接口的方法,获取查询到的树形结构的节点。可以通过递归遍历节点,实现树形结构的展示。 下面是一个示例代码,供参考: ``` // 定义实体类 public class TreeNode { private Integer id; private Integer parentId; private String name; // getter和setter方法 } // 定义Mapper接口 public interface TreeNodeMapper { List<TreeNode> selectTreeNodes(Integer parentId); } // 编写Mapper.xml配置文件 <select id="selectTreeNodes" parameterType="java.lang.Integer" resultType="TreeNode"> with recursive cte(id, parent_id, name) as ( select id, parent_id, name from tree_node where parent_id = #{parentId} union all select tn.id, tn.parent_id, tn.name from tree_node tn inner join cte on tn.parent_id = cte.id ) select * from cte; </select> // 调用Mapper接口 @Autowired private TreeNodeMapper treeNodeMapper; public List<TreeNode> getTreeNodes(Integer parentId) { return treeNodeMapper.selectTreeNodes(parentId); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值