My_UID(我的ID)        Friend_UID(我的好友的ID)
       2100051                       2100045
       2100014                       2100000
       2100051                       2100044
       2100045                       2100056
       2100051                       2100016
       2100044                       2100016
       2100045                       2100016
表里有两个字段,分别对应我和我的好友的ID,假如我现在登陆后的ID是2100051 ,我的好友的 ID 就是 2100045 和 2100044。
问题如下:
我想计算我和其他用户之间存在的路径的最短通路的度数,例如:计算我
( 2100051 ) 和另外一用户( 2100016 )的最短通路的度数,
他们之间存在的路径是 2100051 --- 2100016( 度数为1 ) 或 2100051 --- 2100044 --- 2100016( 度数为2 ) 或 2100051 --- 2100045 --- 2100016( 度数为2 ),即我( 2100051 )可以直接和 ( 2100016 )连接,也可以通过我的好友( 2100044 ) 找到 2100016 ,因为 ( 2100016 ) 是 ( 2100044 ) 的好友。所以他们之间的最段通路是 ( 2100051---2100016 ),他们的最段度数就是 1 ,其他两条通路的度数都是 2 。有点迷糊,不知道说清楚了没有,谢谢。

解决方案 »

  1.   

    --以前写的一个,跟你的要求差不多,你自己看着改改看就是了--按照你说的逻辑,步骤如下--1.建立查询函数
    CREATE  FUNCTION dbo.F_RouteSearch
    (
    @START INT,
    @END INT
    )
    RETURNS VARCHAR(200)
    AS
    BEGIN
    DECLARE @NODE INT
    DECLARE @COUNT INT
    DECLARE @RESULT VARCHAR(100)
    SET @COUNT=0
    SET @RESULT=''
    DECLARE @TMP TABLE
    (
    ID INT,
    F_ID VARCHAR(20),
    STEP INT
    )
    INSERT INTO @TMP SELECT @START,(SELECT F_ID FROM LIST WHERE ID=@START),@COUNT
    WHILE @END NOT IN (SELECT ID FROM @TMP)
    BEGIN
    SET @COUNT=@COUNT+1
    INSERT INTO @TMP
    SELECT DISTINCT a.ID,a.F_ID,@COUNT FROM List a,@TMP b WHERE CHARINDEX(','+RTRIM(a.ID)+',',','+b.F_ID+',')>0 and a.ID not in (SELECT ID FROM @TMP)
    IF @@ROWCOUNT=0
    BEGIN
    SELECT @RESULT='NO ROUTE FIND'
    GOTO RETURNHANDLE
    END
    END
    SELECT @RESULT=RTRIM(@COUNT)+':'+RTRIM(@END)
    WHILE @COUNT>1
    BEGIN
    SET @COUNT=@COUNT-1
    SELECT TOP 1 @END=ID FROM @TMP WHERE STEP=@COUNT AND CHARINDEX(','+RTRIM(@END)+',',','+F_ID+',')>0
    SELECT @RESULT=RTRIM(@COUNT)+':'+RTRIM(@END)+'→'+@RESULT
    END
    SELECT @RESULT='0:'+RTRIM(@START)+'→'+@RESULT
    RETURNHANDLE:
    RETURN @RESULT
    END
    GO--准备测试数据(与LZ提供数据相同)
    insert into list
    select 5,'1,30,3' union all
    select 7,'9,5,8' union all
    select 10,'7,21,30' union all
    select 11,'7,5,30' union all
    select 21,'7,66,30' union all
    select 30,'21,88,99'
    go
    --测试select dbo.F_RouteSearch(5,7) --从5开始,到7为止--结果
    /*
    0:5→1:30→2:21→3:7
    注解
    5通过30,21最后找到7,耗费3步完成
    5不认识11,因此LZ所说的路径5-11-7不成立
    */
      

  2.   

    LouisXIV(夜游神) :5可以找到和7的通路,但是如果要找7和99的通路,就找不到了。