2013-08-01 2 views
1

다음 쿼리가 있으며 뉴스 기사 테이블에서 선택합니다. 여러 정렬 요인으로 인해 다음 날짜 페이지를 찾을 수 없습니다.특정 ID 뒤에 행 선택

내가 가진 매개 변수는 쿼리 결과 집합의 마지막 ID이므로 다음 페이지를 가져올 수있는 방법은 무엇입니까? 다시 말해서 페이지 인덱스가 없습니다. 이전 쿼리의 결과는

SELECT TOP (20) ID, 
       Datediff(SECOND, CONVERT(DATETIME, '1970-01-01', 102), 
       RELEASE_DATE) AS date, 
       Datediff(SECOND, CONVERT(DATETIME, '1970-01-01', 102), EDIT_DATE 
       ) AS lastchanged, 
       IMPORTANT 
FROM ARTICLES AS news WITH (NOLOCK) 
WHERE (STATUS = 1) 
     AND (RELEASE_DATE <= Getutcdate()) 
ORDER BY IMPORTANT DESC, 
      DATE DESC, 
      LASTCHANGED DESC 

이 내 데이터의 예를 설정 싶은 것은 일부 응용 프로그램에서 한 번에 20 개 게시물을 표시하고 다음 다음 가져올 수있을 경우

id  date  lastchanged important 
187346 1366070400 1345212540 1 
187306 1365984000 1345290300 1 
187330 1365984000 1342457880 1 
187344 1363392000 1342461540 1 
187343 1363392000 1342461300 1 
187342 1363392000 1342459980 1 
187339 1363392000 1342459800 1 
187337 1363392000 1342458960 1 
187335 1363392000 1342458720 1 
187334 1363392000 1342458600 1 
187332 1363392000 1342458060 1 
187331 1363392000 1342457940 1 
187327 1363392000 1342457340 1 
187328 1363392000 1342457340 1 
187326 1363392000 1342456860 1 
187323 1363392000 1342456020 1 
187322 1363392000 1342455480 1 
187321 1363392000 1342454700 1 
187316 1363392000 1342454580 1 
187320 1363392000 1342454520 1 
+0

ID 최근 번호를 표 순을하거나 반복 할 수 있기 때문에 이후 ? –

+0

고유 값 –

+1

그럼 어디서 id> $ lastId를 할 수 없습니까? 나는 혼란스러워. – vanamerongen

답변

1
;WITH CTE(ROW,ID, 
       [date], 
       [lastchanged], 
       IMPORTANT) AS 
(
SELECT rOW_NUMBER() OVER(oRDER BY IMPORTANT DESC, 
      DATE DESC, 
      LASTCHANGED DESC) AS rOW,ID, 
       Datediff(SECOND, CONVERT(DATETIME, '1970-01-01', 102), 
       RELEASE_DATE) AS date, 
       Datediff(SECOND, CONVERT(DATETIME, '1970-01-01', 102), EDIT_DATE 
       ) AS lastchanged, 
       IMPORTANT 
FROM ARTICLES AS news WITH (NOLOCK) 
WHERE (STATUS = 1) 
     AND (RELEASE_DATE <= Getutcdate()) 
       ) 

SELECT TOP 20 ID, 
       [date], 
       [lastchanged], 
       IMPORTANT FROM CTE WHERE rOW>cOALESCE((sELECT rOW FROM CTE WHERE iD=1871),0); 

가 this.In의 예제를 예시 나는 상위 5 만 선택 어떤 id를 입력하면 다음 5 개의 레코드를 가져 오는 것을 볼 수 있습니다.

Sql Fiddle Demo - 내가 처음 엔 다섯 번째 레코드를 얻는 것보다 여기 엔 entred-1과 같이 잘못된 ID를 입력하십시오.

Sql Fiddle Demo 기입하십시오 ID = 187,339 먼저 페이지의 마지막 번호

Sql Fiddle Demo 기입하십시오 이드 = 187,331는 제 페이지 등

2

결과가 끝날 때까지 20 게시물을을 사용하여일할 수 있습니다.

SELECT   
    id, DATEDIFF(SECOND, CONVERT(DATETIME, '1970-01-01', 102), release_date) AS date, DATEDIFF(SECOND, CONVERT(DATETIME, '1970-01-01', 102), edit_date) AS lastchanged, important 
FROM articles AS news WITH (NOLOCK) 
WHERE (status = 1) AND (release_date <= GETUTCDATE()) 
ORDER BY important DESC, date DESC, lastchanged DESC 
OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY; 

및 후속 쿼리가 offset 값을 증가시킬 것이다 :

초기 쿼리가 될

SELECT   
    id, DATEDIFF(SECOND, CONVERT(DATETIME, '1970-01-01', 102), release_date) AS date, DATEDIFF(SECOND, CONVERT(DATETIME, '1970-01-01', 102), edit_date) AS lastchanged, important 
FROM articles AS news WITH (NOLOCK) 
WHERE (status = 1) AND (release_date <= GETUTCDATE()) 
ORDER BY important DESC, date DESC, lastchanged DESC 
OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY; 
여기
+0

문제는 제가 오프셋으로 사용할 페이지 인덱스가 없기 때문에 이전 쿼리의 마지막 ID입니다. –

+0

@ ComputerJy 예, 이것이 작동하려면 페이지 오프셋을 호출 응용 프로그램의 변수에 저장해야합니다. – jpw

+0

@ComputerJy 아래 답변을 시도해 볼 수 있습니다. –