Mysql-TREE实现

Mysql 官方并没有实现树结构获取数据的方案,但是可以通过Mysql提供的函数 FIND_IN_SET(str,strlist) 递归实现;

FIND_IN_SET(str,strlist) 函数介绍

假如字符串str 在由N 子链组成的字符串列表strlist 中, 则返回值的范围在 1 到 N 之间 。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。 这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。

mysql> SELECT FIND_IN_SET(‘b’,’a,b,c,d’);

TREE实现

// 1 创建表
CREATE TABLE IF NOT EXISTS t_tree_table (
    `id` INT (32) AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR (64) COMMENT '名称',
    pId VARCHAR (32)
);
// 2 创建递归存储过程
DROP FUNCTION  IF EXISTS `getChildLst`;
CREATE FUNCTION `getChildLst`(rootId INT)
    RETURNS varchar(1000)
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempChd VARCHAR(1000);

    SET sTemp = '#';
    SET sTempChd =cast(rootId as CHAR);

    WHILE sTempChd is not null DO
      SET sTemp = concat(sTemp,',',sTempChd);
      SELECT group_concat(id) INTO sTempChd 
      FROM t_tree_table where FIND_IN_SET(pId,sTempChd)>0;
    END WHILE;
    RETURN sTemp;
END;
// 3 使用
SELECT
    *
FROM
    t_tree_table
WHERE
    FIND_IN_SET(id, getChildLst('1'));

// 4 查询结果
Mysql-TREE实现_第1张图片

// 5 可能遇到问题
创建函数问题描述:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

问题分析:
这是我们开启了bin-log, 我们就必须指定我们的函数是否是
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

解决方案:
临时设置:
set global log_bin_trust_function_creators=TRUE;
my.ini 设置:
[mysqld]
加上log_bin_trust_function_creators=1

你可能感兴趣的:(Mysql类)