2015-10-11 87 views
0

我注意到使用(offset, fetch)和rownumber的不同行爲。使用ROW_NUMBER()代替OFFSET和FETCH

當我使用行號時,它返回我期望的結果。

所以我sequelize查詢如下所示:

ClanModel.findAll({ 
    order: [["Wins", "DESC"]], 
    offset: page * 5, 
    limit: 5 
}) 

SQL查詢從第一行開始

SELECT 
    [clid] AS [ClanId], [Name], [Wins], [Losses], 
    [totalPoint] AS [TotalPoints] 
FROM 
    [Clan] AS [Clan] 
ORDER BY 
    [Clan].[Wins] DESC 
    OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY; 

結果:

[ { Name: 'Test6'}, 
    { Name: 'Test5'}, 
    { Name: 'Test4'}, 
    { Name: 'Test3'}, 
    { Name: 'Test2'} ] 

SQL查詢第五屆結果後:

SELECT 
    [clid] AS [ClanId], [Name], [Wins], [Losses], 
    [totalPoint] AS [TotalPoints] 
FROM 
    [Clan] AS [Clan] 
ORDER BY 
    [Clan].[Wins] DESC 
    OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY; 

結果:

[ { Name: 'Test5'}, 
    { Name: 'Test4'}, 
    { Name: 'Test3'}, 
    { Name: 'Test2'}, 
    { Name: 'Test1'} ] 

行號查詢:

SELECT 
    [Name], [Wins], [Losses], [TotalPoints] AS [TotalPoints] 
FROM 
    (SELECT 
      [clid] AS [ClanId], [Name], [Wins], [Losses], 
      [totalPoint] AS [TotalPoints], 
      ROW_NUMBER() OVER (ORDER BY [Wins]) AS RowNum 
     FROM 
      [Clan]) as Clan 
WHERE 
    Clan.RowNum BETWEEN 5 AND 10 

返回結果我想到:

Test5 
Test6 
Test7 
Test8 
Test9 
Test10 

我的數據庫記錄:

Test1 
Test2 
Test3 
Test4 
Test5 
Test6 
Test7 
Test8 
Test9 
Test10 

我想使用我的sequelize模型來獲取我的數據,而不是使用普通的sql查詢。但我無法找到在續集中使用行號的方法。

有沒有辦法仍然使用sequelize來獲取我的數據?

+0

你應該編輯你的問題,並顯示完整的數據,而不僅僅是'name'。 –

回答

1

您沒有顯示完整的數據。所以,這是一個猜測:你在wins列有聯繫。 order by的排序不穩定,甚至不一致,這意味着關係可以以任何順序返回。因此,通過包括名稱解決這個問題:

SELECT [clid] AS [ClanId], [Name], [Wins], [Losses], [totalPoint] AS [TotalPoints] 
FROM [Clan] AS [Clan] 
ORDER BY [Clan].[Wins] DESC, Clan.Name 
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY; 

假設Name是獨一無二的,這將使排序是一致的。如果這在SQL中起作用,那麼它應該很容易在sequelize中實現。

+0

這對我有效,我所有的勝利被設置爲零,這是造成問題。 – Jamie

相關問題