遇到一个 PostgreSQL 很奇葩的排序问题(BUG?)

2020-04-16 15:27:44 +08:00
 imherer

我有一张 goods 表主要有 id 、name 、recommend 这 3 个字段,其中 id 为自增主键,name 为字符串,recommend 为 int

我往表里插了 37 条测试数据,id 从 1-37,其中 id=1 的 recommend 为 0,其他剩下 36 条全为 0

在插入 37 条测试数据后,我修改过部分数据的 name 值,于是当我使用如下 SQL 语句

SELECT * FROM goods ORDER BY recommend DESC;

返回的结果 id=1 的排在第一位,剩下的 36 按自增 id 随机排列。其中 id=2 的这条记录排在倒数第二位(重点就是这一条记录)。

现在遇到一个比较奇葩的问题,我分页获取的时候

SELECT * FROM mall.goods  ORDER BY recommend DESC LIMIT 10 OFFSET 0;

上面这条 SQL 语句居然第二条记录是 id=2 的数据

SELECT * FROM mall.goods  ORDER BY recommend DESC LIMIT 10 OFFSET 30;

同样,上面这条 SQL 语句里也出现了 id=2 的数据,不过它出现的位置是在倒数第二位,和第一条 SQL 语句排序出现的位置一致

这啥情况?

4936 次点击
所在节点    PostgreSQL
24 条回复
imherer
2020-09-16 14:57:22 +08:00
@HashV2 再加一个不会变的字段排序,例如主键
HashV2
2020-09-16 15:04:34 +08:00
@imherer 我是使用 Django ORM 来进行操作的 之前在 mysql 上没遇到这个问题

我很起怪 不变的排序字段条件且 update 的字段不在排序字段中 排序为什么有变化?
imherer
2020-09-16 15:40:02 +08:00
@HashV2 好像 postgresql 数据库数据在 table 里的排序不是固定的,有时候 update 了某个值之后排序就会变(没排序的情况下)
HashV2
2020-09-16 15:49:37 +08:00
@imherer 手动在排序参数最后额外添加一个 id/创建时间键 确实解决了这个问题

虽然很奇怪 但先这么用着吧 谢谢啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663098

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX