展示一个用户关系,多级的
数据格式如下
ID ParentID Level OrderNum
960 878 1 2
961 960 2 3
962 961 3 4
963 878 1 7
964 963 2 8
965 964 3 9
966 963 2 11
967 878 1 13
968 878 1 14
969 878 1 15
请问根据 level 字段来进行分页,orderNum排序不能变
比如 按2个用户分页
第一页数据如下
ID ParentID Level OrderNum
960 878 1 2
961 960 2 3
962 961 3 4
963 878 1 7
964 963 2 8
965 964 3 9
966 963 2 11
第二页
967 878 1 13
968 878 1 14
第三页
969 878 1 15
在线等答案!!
------解决方案--------------------
- SQL code
IF OBJECT_ID('T') IS NOT NULL DROP TABLE TCREATE TABLE T(ID INT, ParentID INT, LEVEL INT,OrderNum int)--测试数据INSERT INTO TSELECT 960, 878, 1, 2 UNION ALLSELECT 961, 960, 2 ,3 UNION ALLSELECT 962, 961, 3 ,4 UNION ALLSELECT 963, 878, 1 ,7 UNION ALLSELECT 964, 963, 2 ,8 UNION ALLSELECT 965, 964, 3 ,9 UNION ALLSELECT 966, 963, 2 ,11 UNION ALLSELECT 967, 878, 1 ,13 UNION ALLSELECT 968, 878, 1 ,14 UNION ALLSELECT 969, 878, 1 ,15 CREATE PROC sp_getUser( @level INT ,--每页几个用户 @PageIndex int--页面索引)AS BEGIN DECLARE @_tab TABLE (id INT IDENTITY(1,1),startIndex INT, endIndex INT,userID INT) DECLARE @_startIndex INT DECLARE @_endIndex INT ;WITH cte AS ( SELECT [主ID]=ID, * FROM T WHERE [LEVEL]=1 UNION ALL SELECT [主ID]=c.[主ID],a.* FROM T a JOIN cte c ON a.ParentID =c.Id ) INSERT INTO @_tab SELECT MIN(id),MAX(id),[主ID] FROM cte GROUP BY [主ID] -- ORDER BY OrderNum --每页的开始索引 SELECT @_startIndex=startIndex FROM ( SELECT * FROM @_tab WHERE id BETWEEN @[email protected] AND @[email protected] ) AS t WHERE [email protected][email protected] --每页的结束索引 SELECT @_endIndex=endIndex FROM ( SELECT * FROM @_tab WHERE id BETWEEN @[email protected] AND @[email protected] ) AS t WHERE [email protected][email protected] PRINT 'start:'+ CAST(@_startIndex AS VARCHAR ) PRINT 'end:'+CAST(@_endIndex AS VARCHAR ) IF @_endIndex IS NULL OR LEN(@_endIndex)=0 BEGIN SELECT * FROM T WHERE id >=@_startIndex END ELSE BEGIN SELECT * FROM T WHERE id BETWEEN @_startIndex AND @_endIndex END END--每页2个用户,第一页EXEC sp_getUser 2,1/*ID ParentID LEVEL OrderNum----------- ----------- ----------- -----------960 878 1 2961 960 2 3962 961 3 4963 878 1 7964 963 2 8965 964 3 9966 963 2 11(7 行受影响)*/--每页2个用户,第二页EXEC sp_getUser 2,2/*ID ParentID LEVEL OrderNum----------- ----------- ----------- -----------967 878 1 13968 878 1 14(2 行受影响)*/--每页2个用户,第三页EXEC sp_getUser 2,3/*ID ParentID LEVEL OrderNum----------- ----------- ----------- -----------969 878 1 15(1 行受影响)*/