2013-06-27 21 views
1

我正在嘗試編寫查詢來實現分頁,我的基本要求是我需要一個查詢,在這裏我可以給出最小和最大範圍的行以返回例如對於頁面1,我需要從1-10的記錄到11-20的頁面等,等等。在指定範圍內獲取行以進行分頁

通過一些幫助形式互聯網和在這裏所以我已經寫下了下面的查詢,但它不是真的這樣應對,並返回我一大堆的行,無論範圍是什麼(可能我錯過了一些加入查詢)

SELECT b.id,b.title,b.name 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY (select NULL as noorder)) AS RowNum, * 
    FROM [student] b 
) as alias,[student] b,[class] c 
WHERE b.[status]=1 
AND c.id=b.class 
AND c.name='Science' 
AND RowNum BETWEEN 1 AND 5 
ORDER BY b.dtetme DESC 

我在修復它的時候丟了,請有人指出錯誤。 謝謝!

+0

請檢查答案這個問題。 http://stackoverflow.com/questions/9013177/mysql-limit-clause-equivalent-for-sql-server – Devasayal

回答

1

您的整個查詢邏輯+ ROW_NUMBER應該進入子查詢。您只使用外部WHERE進行分頁。

ROW_NUMBER必須有ORDER BY在其上執行尋呼。

SELECT a.id , 
     a.title , 
     a.name 
FROM  
    ( 
     SELECT ROW_NUMBER() OVER (ORDER BY b.dtetme DESC) AS RowNum, b.* 
     FROM [student] b 
     INNER JOIN [class] c ON c.id = b.class 
     WHERE b.[status] = 1 
     AND c.name = 'Science' 
    ) a 
WHERE RowNum BETWEEN 1 AND 10 -- change numbers here for pages 
ORDER BY t.RowNum 
+0

它說'專欄'id'多次指定'a'。' – Maven

+0

@Maven替換*在子查詢中實際需要的列。檢查編輯後的版本。 –

+0

@Maven錯誤是因爲你在'Student'和'Class'表中都有'id'列。 –

1

我認爲這個問題是在FROM個加法的[student] b,請嘗試將加入這個子查詢。

SELECT a.id, a.title, a.name 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY (select NULL as noorder)) AS RowNum, * 
    FROM [student] b 
    JOIN [class] c ON c.id = b.class 
    WHERE b.[status]=1 
    AND c.name='Science' 
) as a 
WHERE a.RowNum BETWEEN 1 AND 5 
ORDER BY a.dtetme DESC 

此外,您可能要考慮將其包裝在過程或功能中,以便更改範圍。

0

看來你想是這樣的:

SELECT t.id,t.title,t.name FROM (
    SELECT s.id,s.title,s.name, RowNum = ROW_NUMBER() OVER(ORDER BY s.dtetme DESC) 
    FROM student s 
    INNER JOIN class c ON c.id = s.class 
    WHERE s.[status]=1 AND c.name='Science') AS t 
WHERE t.RowNum BETWEEN 1 AND 5 
ORDER BY t.RowNum