with t1 as
 (select 1 id, 'zhangsan' username
    from dual
  union all
  select 2 id, 'lisi' username
    from dual
  union all
  select 3 id, 'wangwu' username
    from dual
  union all
  select 4 id, 'zhaoliu' username
    from dual),
t2 as
 (select 1 ower_id, 2 friend_id
    from dual
  union all
  select 1 ower_id, 3 friend_id
    from dual
  union all
  select 2 ower_id, 3 friend_id
    from dual
  union all
  select 3 ower_id, 4 friend_id
    from dual)
select t1.username
  from t1,
       (select distinct friend_id
          from t2
         start with ower_id = 1
        connect by ower_id = prior friend_id) t2
 where t1.id = t2.friend_id;

解决方案 »

  1.   

    需要加上NOCYCLE 否则有可能出现树形查询的循环,报错
    select t1.username
      from t1,
           (select distinct friend_id
              from t2
             start with ower_id = 1
            CONNECT BY NOCYCLE ower_id = prior friend_id) t2
     where t1.id = t2.friend_id;
      

  2.   

    mysql没有直接的树形结构的查询,需要用函数实现了吧
    楼主可以到mysql区去问问看
      

  3.   

    mysql不支持递归查询,递归SP解决
      

  4.   

    这个无法直接使用简单SQL语句实现,只能通过存储过程来循环处理,直至找不到新的朋友。算法并不复杂, 一个循环,把已知的朋友放入A表,然后再 select uid from  朋友表 where id in (select id from A)
    直至返回结果为空,即输出A表中的名单即可。