`
tivon
  • 浏览: 68074 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

mysql create function 通过子ID 查询 所有父ID

    博客分类:
  • SQL
sql 
阅读更多

已知某产品XXX    种类名为: 化浊降脂剂

对应表种类表中  ctg_id=33  查询其种类的 所有父类种类 如下:
ctg_cname  ctg_id   ctg_fatherid
'化浊降脂剂', 33         8
'内科用药',   8          5
'中成药',     5          1
'药品',       1         null

显然满足  树结构

药品'
----中成药'
----------内科用药'
-----------------化浊降脂剂'

根据产品 得到所有的 产品种类名称(父亲到儿子)

开始比较笨的办法 查询 sql
SELECT ctg_cname ,ctg_id FROM product_category   WHERE ctg_id in (33,)
UNION
SELECT a.ctg_cname ,a.ctg_id FROM product_category a  WHERE  a.ctg_id=(SELECT ctg_fatherid FROM product_category   WHERE ctg_id=33 ) 
UNION
SELECT b.ctg_cname ,b.ctg_id FROM product_category b  WHERE  b.ctg_id=(SELECT ctg_fatherid FROM product_category a  WHERE  a.ctg_id=(SELECT ctg_fatherid FROM product_category   WHERE ctg_id=33 )) 
UNION
SELECT c.ctg_cname ,c.ctg_id FROM product_category c  WHERE  c.ctg_id=(SELECT ctg_fatherid FROM product_category b  WHERE  b.ctg_id=(SELECT ctg_fatherid FROM product_category   WHERE  ctg_id=(SELECT ctg_fatherid FROM product_category   WHERE ctg_id=33 )) ) 


后来 设想  如果可以 一次全部拿到其 种类和父种类 ID 一次查询
SELECT ctg_cname ,ctg_id FROM product_category   WHERE ctg_id in (33, 父亲IDS,...)

那么效果不是更好。

想到了  create function 调用 递归调用 自己 输出所有  ids

// 发现递归 调用 貌似 mysql不支持
//  也了测试方法  调用失败  后放弃
DELIMITER $$
CREATE FUNCTION getPatherCategory (id INT,str char(20)) RETURNS   CHAR(50)
BEGIN
DECLARE fid INT default -1;
SET fid=(SELECT ctg_fatherid FROM product_category  WHERE ctg_id=id);
IF fid > 0 THEN
SET str=concat(str,',',fid,',',id); RETURN getPatherCategory(fid,str);
ELSE SET str=concat(str,',',id);
END IF;
RETURN str;
END $$


//改用如下方法  成功
//*_*!
DELIMITER $$
CREATE FUNCTION getPatherCategory (id INT) RETURNS   CHAR(255)
BEGIN
DECLARE fid INT default 1;
DECLARE str CHAR(255) default id;
WHILE id>0 DO   
SET fid=(SELECT ctg_fatherid FROM product_category  WHERE ctg_id=id);
IF fid > 0 THEN
SET str=concat(str,',',fid); 
SET id=fid;
ELSE SET id=fid;
END IF;
END WHILE;  
RETURN str;
END $$


用到了 while  if  调用
使用到的 sql
 show function status;  
drop function getPatherCategory
select getPatherCategory(33)

输出
'33,8,5,1'

-----------------\
可能会遇到一些问题  在创见 function的时候

创建function时

出错信息:

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指定一个参数。

简单修改一下:
DELIMITER $$
CREATE FUNCTION getPatherCategory (id INT) RETURNS   CHAR(255) READS SQL DATA
BEGIN
DECLARE fid INT default 1;
DECLARE str CHAR(255) default id;
WHILE id>0 DO   
SET fid=(SELECT ctg_fatherid FROM product_category  WHERE ctg_id=id);
IF fid > 0 THEN
SET str=concat(str,',',fid); 
SET id=fid;
ELSE SET id=-1;
END IF;
END WHILE;  
RETURN str;
END $$



---------------------------/
在创建查询的时候 不能直接执行
SELECT ctg_cname ,ctg_id FROM product_category   WHERE ctg_id in (getPatherCategory (33));
//33 为程序传进的ID

比较郁闷只能  先 select getPatherCategory (33);   再组装ID入SQL中查询

目前没有找到更合适的办法,对于 树结构数据查询的方法, 你有好办法么,最好一条SQL就可以搞定全部  ?
分享到:
评论

相关推荐

    MySql 中查询树形结构的全部子项列表 Function

    本文将深入探讨如何在MySQL中查询树形结构的全部子项列表,结合提供的`MySql_Link_Function.sql`文件,我们将探讨一种有效的方法来实现这一功能。 首先,树形结构在数据库中的存储通常采用自引用的方式,即每个节点...

    MySQL通过自定义函数实现递归查询父级ID或者子级ID

    本文将详细介绍如何通过MySQL的自定义函数来查询父级ID和子级ID。 首先,我们需要创建一个示例表格`table_name`,该表包含三个字段:`id`(主键)、`status`(状态)和`pid`(父级ID)。表的结构如下: ```sql ...

    mysql递归查询.doc

    这个函数使用了递归方式来查询某个部门的所有下属部分,通过不断地查询父部门 ID,直到达到根部门。 类似地,可以使用以下语句来查询某个部门的所有上级部门: ```sql SELECT * FROM t_areainfo WHERE FIND_IN_SET...

    MySQL实现树状所有子节点查询的方法

    在MySQL中,实现树状所有子节点的查询并非像Oracle那样可以直接使用Hierarchical Queries和`CONNECT BY`语句。然而,尽管MySQL不直接支持这样的功能,我们仍然可以通过其他方法来达到相同的效果。以下将详细介绍几种...

    MySQL递归查询

    MySQL 递归查询是指在 MySQL 中实现类似 Oracle Hierarchical Queries 的功能,用于查询树形结构中的所有子节点。由于 MySQL 目前还没有内置的递归查询功能,因此需要使用其他方法来实现。 第一种方法:使用函数来...

    mysql雪花算法生成唯一整型ID主键的实现方法

    MySQL 雪花算法生成唯一整型ID主键的实现主要针对大数据环境下,需要大量生成全局唯一ID的需求。雪花算法是一种分布式ID生成策略,由Twitter开源,其设计目标是在分布式系统中生成具有全局唯一性、有序性和高并发性...

    MySQL 5.7 create VIEW or FUNCTION or PROCEDURE

    在MySQL中,使用`CREATE FUNCTION`创建自定义函数。函数可以在查询语句中直接使用,提高代码的可读性和复用性。例如: ```sql DELIMITER // CREATE FUNCTION calculate_discount(amount DECIMAL(10,2), discount_...

    mysql递归查询.txt

    3. **游标操作**:使用游标 `cur1` 查询 `tb_content_category` 表中父 ID 为 `rootId` 的所有子节点 ID,并逐个处理这些子节点。 4. **递归调用**:对于每个子节点,递归调用 `createChildLstOne` 存储过程,并将...

    Mysql树形递归查询的实现方法

    在MySQL中处理这类数据时,可能会遇到需要查询某节点的所有子节点或父节点的情况。由于MySQL不直接支持像Oracle那样使用`START WITH ... CONNECT BY`的递归查询语法,我们需要采取其他策略来实现类似的功能。 在...

    MySQL实现递归查询的三种方式.rar

    例如,使用子查询来获取每个员工的所有下属,然后将这些结果与原表进行连接,直到没有新的下属为止。这种方式对数据库性能有一定要求,因为可能会产生大量的数据扫描。 ```sql SELECT e1.emp_id, e1.name FROM ...

    MySQL 查询文章的上下篇

    在MySQL数据库中,查询文章的上下篇是一个常见的需求,特别是在构建博客系统或者内容管理系统时。这一功能能够帮助用户更好地浏览和理解连续性内容。本文将深入探讨如何利用MySQL的SQL语句来实现这一功能,同时结合`...

    多级数据-Mysql中的递归层次查询(父子查询).doc

    在 MySQL 中,实现递归层次查询(父子查询)是一种复杂的操作,特别是当我们需要查询某个节点下的所有节点或节点上的所有父节点时。 Oracle 中有 Hierarchical Queries 可以通过 CONNECT BY 来查询,但是,在 MySQL ...

    MYSQL

    7.29 注释句法 7.30 CREATE FUNCTION/DROP FUNCTION (创建函数/抛弃函数)句法 7.31 MySQL对保留字很挑剔吗? 8 MySQL 教程 8.1 联接和断开服务器 8.2 输入查询 8.3 常用查询的例子 ...

    MySQL中文参考手册.chm

    7.27 CREATE INDEX (创建索引)句法 7.28 DROP INDEX (抛弃索引)句法 7.29 注释句法 7.30 CREATE FUNCTION/DROP FUNCTION (创建函数/抛弃函数)句法 7.31 MySQL对保留字很挑剔吗?...

    nodejs连接mysql实例

    在这个例子中,我们通过 `connection.query()` 发送了一个 SQL 查询语句,该语句用于从 `t_user` 表中选择 id 为 1 的用户的姓名。如果查询成功,将输出该用户的姓名。需要注意的是,`connection.query()` 接受一个...

    MySQL中文参考手册

    + 4.11.5 Linux (所有的Linux版本)注意事项 # 4.11.5.1 Linux-x86 注意事项 # 4.11.5.2 RedHat 5.0 注意事项 # 4.11.5.3 RedHat 5.1 注意事项 # 4.11.5.4 Linux-SPARC 注意事项 # 4.11.5.5 Linux-Alpha 注意...

    mysql计算连续天数,mysql连续登录天数,连续天数统计

    这个查询通过自连接找到所有日期连续的登录记录,然后通过`DATEDIFF`函数计算连续的天数。`NOT EXISTS`子句确保了没有其他登录记录在这两个日期之间,从而保证了连续性。 为了实现一个通用的MySQL函数,我们可以...

    mysql官方中文参考手册

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL ...

    MySQL语法大全_MySQL语法大全_

    - 子查询可以在 `SELECT`, `FROM`, `WHERE` 子句中嵌套,如 `SELECT * FROM employees WHERE id IN (SELECT manager_id FROM departments);` 7. 视图(View): - `CREATE VIEW` 创建虚拟表,如 `CREATE VIEW ...

Global site tag (gtag.js) - Google Analytics