2010-01-16 37 views
7

我正在開發一個帶有投票的在線畫廊,併爲圖片和投票設置了單獨的表格(對於存儲圖片ID和選民的ID)。這些表格是這樣的:PICTURE <--(1:n, using VOTE.picture_id)-- VOTE。我想查詢圖片表,並通過票數排序輸出。這是我做的:使用LIMIT/OFFSET在SQL中分頁有時會導致在不同頁面上出現重複問題

SELECT 
    picture.votes_number, 
    picture.creation_date, 
    picture.author_id, 
    picture.author_nickname, 
    picture.id, 
    picture.url, 
    picture.name, 
    picture.width, 
    picture.height, 
    coalesce(anon_1."totalVotes", 0) 
FROM picture 
LEFT OUTER JOIN 
    (SELECT 
     vote.picture_id as pid, 
     count(*) AS "totalVotes" 
    FROM vote 
    WHERE vote.device_id = <this is the query parameter> GROUP BY pid) AS anon_1 
ON picture.id = anon_1.pid 
ORDER BY picture.votes_number DESC 
LIMIT 10 
OFFSET 0 

OFFSET對於不同的頁面當然是不同的。

但是,在不同的頁面上顯示具有相同ID的圖片。我想原因是排序,但不能構建任何更好的查詢,這將不允許重複。有人可以給我一個提示嗎?

在此先感謝!

回答

12

你是否每頁執行一個查詢來顯示?如果是的話,我懷疑數據庫不能保證有相同票數的項目的合理訂單。因此,如果兩個項目的票數相同,則第一個查詢可能會返回{ item 1, item 2 },第二個查詢可能會返回{ item 2, item 1}。如果物品實際上是物品10和11,則同一物品可能出現在第1頁上,然後出現在第2頁上。

我曾經有過這樣的問題。如果這也是你的情況下,通過追加額外條款的順序,以確保與相同票數,如項目的一致排序:

ORDER BY picture.vote, picture.ID

+0

這有幫助,謝謝! – 2010-01-16 15:40:56

2

簡單的解釋是,您在查看不同頁面時添加了一些數據或發生了一些投票。

我確定如果您要通過ID或creation_date進行排序,此問題將消失。

即你的代碼沒有問題

+0

不是。我做了一個測試腳本,它以原子方式獲取所有頁面並打印顯示圖片的ID,並且重複項仍然存在 – 2010-01-16 15:26:22

0

在我的情況下,這個問題是由於空值Order By子句,我通過在Order By子句中添加另一個Unique ID字段以及其他字段來解決此問題。

相關問題