求助function中select后面的where为何不起作用

christ 2014-08-06 04:37:06
求助:
有一商品分类表tgoodstype ,做递归分类,表结构数据如下


如果直接写sql
SELECT ParentID FROM tgoodstype where GoodsTypeID= 44 -- 或 = '44'
不用想,结果肯定是 40

想写个函数 传入一个分类的id,得到该分类的所有父类的Id 以‘,’分开
第一次用函数 ,写网上查了下资料 ,写了下面这个样的sql

drop Function IF EXISTS fGetGoodsTypeParentIdList;
DELIMITER $$
CREATE FUNCTION `dbshop`.`fGetGoodsTypeParentIdList` (goodsTypeId int)
RETURNS text
BEGIN
declare tempList text;
declare tempChilidId varchar(1000);

SET tempList='';
SET tempChilidId = cast(goodsTypeId as CHAR);

-- 此处应该为while循环 set temp那一句应该在select前面
-- 这里去掉是为了测试验证 第一次的查询就会出现问题

SELECT ParentID into tempChilidId FROM tgoodstype
where GoodsTypeID= tempChilidId limit 1;
SET tempList= CONCAT(tempList,',',tempChilidId);

RETURN tempList;
END

函数创建完成后,调用
select fGetGoodsTypeParentIdList(44);
得到的结果出乎我的意外 为 : ,-2
如果不在where后面加上 limit 1
直接会报错,提示的意思应该是 查询的结果为多条数据 不能执行into
而这个-2正是那个表的数据中的第一条数据的ParentID的值
所以可以肯定的是 select后面的 where 没有起作用
我试过另外定义个变量在where后面那里去比较 而不是直接跟into那个变量比较
结果还是一样

弄了半天时间了,还是没找到怎么解决,求大神指点!



...全文
136 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
haiwei1103 2018-08-15
  • 打赏
  • 举报
回复
楼主后来解决了吗,我在oracle中野遇到了这个问题,相同的sql,直接执行没问题,在function中where条件就失效了,查出多条
ACMAIN_CHM 2014-08-06
  • 打赏
  • 举报
回复
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
benluobo 2014-08-06
  • 打赏
  • 举报
回复
这样 你贴出整个循环的语句
christ 2014-08-06
  • 打赏
  • 举报
回复
去掉了之后直接得到个null 就是把where后面改成 GoodsTypeID= goodsTypeId 直接用传入的参数 结果也不对
benluobo 2014-08-06
  • 打赏
  • 举报
回复
你的那个去掉 SET tempChilidId = cast(goodsTypeId as CHAR); 就可以了
christ 2014-08-06
  • 打赏
  • 举报
回复
跟我写的没什么区别 ,只不过是用的loop 我说的意思是 不写循环 就单独执行一次都不行 唉 已经找到个方法 直接写sql语句查询能得到结果了 不过没弄清楚这个问题 还是很不爽
qq_16785111 2014-08-06
  • 打赏
  • 举报
回复
benluobo 2014-08-06
  • 打赏
  • 举报
回复
这个好像是获得下级地域的 仔细看了一下
benluobo 2014-08-06
  • 打赏
  • 举报
回复
给你一个关于获得上级地域的fun
benluobo 2014-08-06
  • 打赏
  • 举报
回复
CREATE FUNCTION topoFolderFun(folderIdTmp bigint(20)) RETURNS varchar(1000) DETERMINISTIC begin declare sTemp varchar(1000); declare sTempChd varchar(1000); set sTemp = ''; set sTempChd = cast(folderIdTmp as char); lable : loop set sTemp = concat(sTemp,',',sTempChd); select group_concat(folderId) into sTempChd from topofolder where find_in_set(superiorId, sTempChd) > 0; if found_rows()=0 or sTempChd is null then return substring(sTemp,2); end if; end loop; end$$
christ 2014-08-06
  • 打赏
  • 举报
回复
在线等啊

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧