mysql create function 通过子ID 查询 所有父ID
已知某产品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,)UNIONSELECT a.ctg_cname ,a.ctg_id FROM product_category a WHERE a.ctg_id=(SELECT ctg_fatherid FROM product_category WHERE ctg_id=33 ) UNIONSELECT 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 )) UNIONSELECT 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 )) )
SELECT ctg_cname ,ctg_id FROM product_category WHERE ctg_id in (33, 父亲IDS,...)
// 发现递归 调用 貌似 mysql不支持// 也了测试方法 调用失败 后放弃DELIMITER $$CREATE FUNCTION getPatherCategory (id INT,str char(20)) RETURNS CHAR(50)BEGINDECLARE fid INT default -1;SET fid=(SELECT ctg_fatherid FROM product_category WHERE ctg_id=id);IF fid > 0 THENSET 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)BEGINDECLARE 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 THENSET str=concat(str,',',fid); SET id=fid;ELSE SET id=fid;END IF;END WHILE; RETURN str;END $$
show function status; drop function getPatherCategoryselect getPatherCategory(33)
DELIMITER $$CREATE FUNCTION getPatherCategory (id INT) RETURNS CHAR(255) READS SQL DATABEGINDECLARE 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 THENSET 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