设为首页 收藏本站
查看: 342|回复: 0

[经验分享] mysql create function 通过子ID 查询 所有父ID

[复制链接]

尚未签到

发表于 2016-10-19 07:44:36 | 显示全部楼层 |阅读模式
已知某产品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就可以搞定全部  ?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-288116-1-1.html 上篇帖子: mysql left join查询,比较两个表不同的行 下篇帖子: MySQL性能调优之Memory or SSD?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表