您的位置:首页 > 数据库 > MySQL

Mysql-TREE实现

2017-08-20 20:30 176 查看
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 查询结果



// 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