最新消息:www.yxkong.com也可以访问

mysql 实现递归查询

mysql/mariadb yxkong 1431浏览 0评论

今天一同事问我个功能,在点击当前分类的时候,把当前分类下所有子分类的内容获取到,我想起前一段时间写的oracle的递归查询了,直接复制给她了,

oracle的递归查询

过了一会她说没法用,因为公司的项目一直都是用oracle,我以为也是oracle的了,她说是mysql,我就百度了一下,给她写了个函数.

CREATE FUNCTION getIds (rootId INT) RETURNS varchar(1000) 
BEGIN
 DECLARE sTemp VARCHAR(1000);
 DECLARE sTempChd VARCHAR(1000);
    
    SET sTemp = '0';//给一个默认值,防止没有值的时候出现null
    SET sTempChd =cast(rootId as CHAR);
   
     WHILE sTempChd is not null DO
       SET sTemp = concat(sTemp,',',sTempChd);
       SELECT group_concat(id) INTO sTempChd FROM kb_classify where FIND_IN_SET(parent_id,sTempChd)>0;
     END WHILE;
     RETURN sTemp;
 END

自定义的函数hibernate不认,我想重写hibernate的mysql的方言,那hibernate应该认了吧,

可实际上并不是那么一回事.

我做了下试验,如果我我直接写

select getIds(1)

在mysql的客户端可以查到内容,如果我把该函数嵌套到sql中时候就没有解析过,比如

select * from tableName where pid in (select getIds(1))

这个时候select getIds(1)不能解析成查到的值,本来想一条sql执行完毕,现在必须分开写,查询一次递归,再去把得到的值传递进去.

public List getListById(Integer id){
    StringBuffer idsSql=new StringBuffer();
    ids.append("select getIds(")
       .append(id)
       .append(")");
    String ids=(String)this.getSession.createSQLQuery(idsSql.toString()).uniqueResult();
    StringBuffer listSql=new StringBuffer();
    listSql.append("select * from table where pid in(")   
           .append(ids).append(")");
   .....           
} 

本来还想把这个函数注册到mysql的方言中了,看到这样就算了

转载请注明:我要编程 » mysql 实现递归查询

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址