《你不知道的 JAVA 系列博客》🔥 送给 OFFSET & LIMIT 的告别气球。

谢谢佬友支持。可以三连+关注后续还有各种文章。

感谢大佬教程, :grinning:

1 个赞

谢谢佬友支持,今后还有更多的文章,可以关注我在 L 站的账号方便收到文章推送。

按照score排序之后 按照Id偏移。不过 seek method是否支持呢?

1 个赞

是的,大致的思路就是这样。当然是支持的。其实解决起来很容易,我先卖个关子等等再发,给其他佬友点机会哈。

还有同学参与竞猜吗~

SELECT first_name, last_name, score, id
FROM players
WHERE game_id = 42
AND (score < 983 OR (score = 983 AND id < last_id))
ORDER BY score DESC, id DESC
LIMIT 5;
2 个赞

关注你的账号,第一时间收到文章推送

1 个赞

?google 有 start 参数可以指定。还有可以在搜索结果直接点击第10页,你如何应对。

已被佬友发现了:secret:

1 个赞

这问题不是很容易处理,就用 Seek,都不用搭配 Offset就能单独实现。有兴趣可以关注这个话题,等其他佬友大家一起讨论,如果没有讨论结果后续我再公布答案。

哈哈哈,是的~谢谢佬友支持。

这一楼的同学已经提前公布了类似的答案了。正确答案就是就是按照某个唯一属性做偏移,把这个属性和 score 作为联合索引。比如:

SELECT player_id, first_name, last_name, score
FROM players
WHERE game_id = 42
AND (score, player_id) < (983, 15)
ORDER BY score DESC, player_id DESC
LIMIT 5;

写成 Seek 就是这样:

DSL.using(configuration)
   .select(PLAYERS.PLAYER_ID,
           PLAYERS.FIRST_NAME,
           PLAYERS.LAST_NAME,
           PLAYERS.SCORE)
   .from(PLAYERS)
   .where(PLAYERS.GAME_ID.eq(42))
   .orderBy(PLAYERS.SCORE.desc(),
            PLAYERS.PLAYER_ID.desc())
   .seek(983, 15) // (!)
   .limit(5)
   .fetch();
2 个赞

写的很清晰,思考逻辑是递进的,很棒tieba_034

1 个赞

谢谢佬友支持的支持。

1 个赞

还有佬友发表答案吗,没有的话后续准备公布答案啦。

1 个赞

一直用的MySql数据库,我就以MySql为数据库来回答了。

这种方式实际上就是ID限定查询法,一般都是用id作为限定条件。如果限定的条件不是唯一的,会存在排序不稳定的情况;同时若限定条件不是查询条件的索引包含字段,会导致回表或者是选错索引,在用id作为限定条件时,极大概率会导致选错索引,用主键索引,所以一般会加上强制索引,如果是非id作为限定条件,最好是将其包含在条件命中的索引中

1 个赞

佬友的回答非常的专业。

再补充一个问题,即上面佬友提到的,谷歌的 1-10 是可以点击的。这个 1-10 任何一页,如何实现呢。

还有同学参与讨论吗。