我正在尝试使用可为空字段对数据进行排序,并尝试使用限制和偏移量来实现分页
这是第一页的查询
SELECT table_name.* FROM table_name ORDER BY table_name.date_field DESC LIMIT 2;
我得到以下结果。
ID | 字段1 | 字段2 | 日期字段 |
---|---|---|---|
1 | 姓名 | 姓名 | 无效的 |
2 | 姓名1 | 姓名1 | 无效的 |
当以下查询用于第二页时
SELECT table_name.* FROM table_name ORDER BY table_name.date_field DESC LIMIT 2 OFFSET 2;
我得到以下结果。
ID | 字段1 | 字段2 | 日期字段 |
---|---|---|---|
2 | 姓名1 | 姓名1 | 无效的 |
3 | 姓名2 | 姓名2 | 无效的 |
如果比较两个表,您会注意到id=2的记录给出了两次(在第一个查询和第二个查询中),这是错误的。
这是一个简单的查询,没有连接,也没有 where 条件。
有人有解决办法吗?提前致谢。
我正在使用 mysql 版本:8.0.34 - MySQL 社区服务器 - GPL
为了扩展 Mustaccio 的评论,数据库没有做任何错误,而是您遇到的问题称为“非确定性排序”。这是你的逻辑上的缺陷。
简而言之,非确定性排序是指
ORDER BY
子句与非唯一值(在您的情况下是一堆NULL
s)一起使用。当要求对多行之间的相同值进行排序时,没有正确或错误的排序方法,并且重复运行同一查询可能会返回这些行的不同顺序,从而使其具有不确定性(无法重复具体确定)。想象一下这个例子:有 10 双袜子,全部是红色,每双上面都有一个唯一的编号。有人告诉你按颜色对它们进行分类,然后递给他们前两双袜子。袜子按什么顺序穿?此外,该人将那 2 双袜子放回堆中,然后要求其他人再次按颜色分类,并将最后 2 双袜子递给他们。由于它们的颜色都相同,因此没有可靠可重复的方法来一次又一次地按颜色对袜子进行分类,并且该人完全有可能两次收到完全相同的袜子(尽管要求第一双和最后一双袜子)对)。
巧合的是,它在您的本地 MySQL 实例上运行,但任何时候您运行查询时都可能会出现问题。对非唯一值进行排序意味着无论您看到过去的结果是什么,都无法保证。
没有这样的配置。这是您设计中的逻辑缺陷,并且存在于所有数据库系统和一般生活中,正如我关于袜子的示例所示。
要解决您的问题,您需要向子句添加一个字段
ORDER BY
,使整个表达式唯一。一个例子是,如果您id
像这样添加字段:这仍然遵循您按 排序的逻辑
date_field
,但是当非唯一日期(例如 s)之间存在平局时NULL
,它会回落到 成为id
一致的决胜局。