2010-01-16 21 views
7

Tôi đang phát triển một thư viện trực tuyến có biểu quyết và có một bảng riêng cho ảnh và phiếu bầu (đối với mỗi phiếu bầu tôi lưu trữ ID của ảnh và ID của cử tri). Các bảng có liên quan như thế này: PICTURE <--(1:n, using VOTE.picture_id)-- VOTE. Tôi muốn truy vấn bảng hình ảnh và sắp xếp đầu ra theo số phiếu bầu. Đây là những gì tôi làm:Phân trang trong SQL với LIMIT/OFFSET đôi khi dẫn đến trùng lặp trên các trang khác nhau

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 khác với các trang khác nhau, tất nhiên.

Tuy nhiên, có những hình ảnh có cùng ID được hiển thị trên các trang khác nhau. Tôi đoán lý do là phân loại, nhưng không thể xây dựng bất kỳ truy vấn nào tốt hơn, điều này sẽ không cho phép trùng lặp. Ai có thể cho tôi một gợi ý?

Cảm ơn trước!

Trả lời

12

Bạn có thực hiện một truy vấn trên mỗi trang để hiển thị không? Nếu có, tôi nghi ngờ rằng cơ sở dữ liệu không đảm bảo một đơn hàng bảo thủ cho các mục có cùng số phiếu bầu. Vì vậy, truy vấn đầu tiên có thể trả lại { item 1, item 2 } và truy vấn thứ 2 có thể trả về { item 2, item 1} nếu cả hai mục có cùng số phiếu bầu. Nếu các mặt hàng thực sự là mặt hàng 10 và 11, thì cùng một mục có thể xuất hiện trên trang 1 và sau đó trên trang 2.

Tôi đã gặp vấn đề như vậy một lần. Nếu đó cũng là trường hợp của bạn, thêm một điều khoản bổ sung cho các đơn đặt hàng bằng để đảm bảo một trật tự nhất quán của mục có cùng một số phiếu, ví dụ:

ORDER BY picture.vote, picture.ID

+0

Điều này đã giúp, cảm ơn! –

2

Lời giải thích mẫu là bạn đã thêm một số dữ liệu hoặc một số phiếu bầu đã xảy ra khi bạn đang xem các trang khác nhau.

Tôi chắc chắn nếu bạn sắp xếp theo ID hoặc creation_date thì vấn đề này sẽ biến mất.

I.e. không có vấn đề với mã của bạn

+0

Không thực sự. Tôi đã thực hiện một kịch bản thử nghiệm mà nguyên tử lấy tất cả các trang và in các ID của hình ảnh được hiển thị, và các bản sao vẫn còn đó –

0

trong trường hợp của tôi có vấn đề này là do giá trị Null trong Theo mệnh đề, tôi đã giải quyết vấn đề này bằng cách thêm một trường ID duy nhất khác trong Thứ tự theo Điều khoản cùng với trường khác.

Các vấn đề liên quan