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 。有点迷糊,不知道说清楚了没有,谢谢。
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 。有点迷糊,不知道说清楚了没有,谢谢。
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不成立
*/