回答

收藏

使用LIMIT / OFFSET在SQL中分页有时会导致在不同页面上重复

技术问答 技术问答 282 人阅读 | 0 人回复 | 2023-09-14

我正在开发一个具有投票权的在线画廊,并且有一个单独的图片和投票表(对于每一次投票,我都会存储图片的ID和投票者的ID)。这些表的相关关系如下:PICTURE4 G1 U; L% B1 A) C, k8 [
0 Q- p$ W4 R4 B! Z' k# m2 L+ O2 V
SELECT' y" u* V$ U6 T! d; m
    picture.votes_number,( _# Z5 ]5 u6 w+ `! `
    picture.creation_date,
1 k* K8 {8 C( q. B5 v( A& ^+ ]1 u    picture.author_id,
$ p. X. ]  u6 H4 x    picture.author_nickname,( \, m. @% m& E! P" j( V
    picture.id,
5 t! I/ q' Z% }" G& V$ B, I    picture.url,8 H) e6 W% x( k! `( ^' V
    picture.name,/ b. g6 l0 ?9 I; i9 @* Q
    picture.width,
) X! H, c6 a% d6 w( S3 j8 I4 F    picture.height,: L0 v, m- D' W7 X/ N
    coalesce(anon_1."totalVotes", 0)) G1 l) v% m4 V' a) {+ E" j. H
FROM picture
; x' W) N% z5 I0 H  HLEFT OUTER JOIN% `; ~2 }; M4 {' h
    (SELECT# H0 k, [4 I1 E& q) @# J7 D
        vote.picture_id as pid,) l* f: k  P$ \6 g
        count(*) AS "totalVotes"
6 z6 Q' V# C+ O9 X. d$ n! `     FROM vote
* B$ x" {5 o" O, @# o# D6 x     WHERE vote.device_id =  GROUP BY pid) AS anon_1# m3 m4 {; A! W8 S; o
ON picture.id = anon_1.pid
' M: Y4 [7 }, z$ j( d' j# dORDER BY picture.votes_number DESC5 W  t8 d& t7 x. \8 x
LIMIT 108 N" i0 b6 l" B' g6 n+ S& Z  H6 v' ~( m
OFFSET 0
4 `3 D7 U1 C; _3 o: Q" z  b* \; R7 }当然,不同页面的偏移量也不同。
; g# F$ S) ]% Q, v4 i+ R4 V' A但是,有些具有相同ID的图片会显示在不同的页面上。我想原因是排序,但无法构造任何更好的查询,这将不允许重复。有人可以给我一个提示吗?
; ]$ a  e5 C4 G6 v* X  S提前致谢!( W( W8 Q" f$ r# y8 L
                # i) K$ K; b5 w* H
解决方案:3 L% n  t. s+ x3 x. t  y
                9 _. t+ `: y, F$ e! ]

/ s, p1 O/ h2 O  I  v2 o2 U0 T, c7 B. E# a: x" J% _
                您是否每页执行一次查询以显示?如果是,我怀疑数据库不能保证票数相同的物品的有效订单。因此,如果两个项目的投票数相同,则可能会返回第一个查询,而{ item% L! p3 C& @. Z4 r
1, item 2 }第二个查询可能会返回{ item 2, item9 p; y4 F) {; u% U7 D# M$ ^
1}。如果项目实际上是项目10和11,则同一项目可能会出现在第1页上,然后出现在第2页上。2 t5 s6 x. k5 v  S  c4 W+ R
我曾经有过这样的问题。如果这也是您的情况,请在订单上方添加一个额外的子句,以确保具有相同投票号的商品的订单顺序一致,例如:
+ `( g; }2 [8 V3 `. @ORDER BY picture.vote, picture.ID
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则