MySQL 具有限制和偏移的默认排序顺序 - 忽略了一些项目 - 为什么?

MySQL Default Sort Order with Limits and Offsets - Some Items Ignored - Why?

我 运行 遇到一个非常有趣的 MySQL 查询问题,该问题似乎仅在未指定排序顺序且查询中使用限制和偏移量时适用。当未指定排序顺序时,结果重复了我的 table 中的一项。根据排序的工作方式,这似乎没有意义。

我创建了一个简单的数据库并且能够将我 运行 的原始问题重现为:

结构:

数据:

使用 SQL 查询时,例如:

SELECT SQL_CALC_FOUND_ROWS * FROM test WHERE test_customer = '1' LIMIT 4 OFFSET 4

当我调整偏移量时,值 "yes" 没有出现在最后一次偏移量查询中。元素 13 重复。这似乎没有意义。

有人知道为什么会这样吗?

有关发生的事情的更详细说明,请参阅显示默认结果与升序结果的完整示例:

https://eamster.tk/mysql_debug_test/mysql_debug.php

感谢任何帮助。我只是想了解发生了什么......现在,我将通过指定 ORDER BY 子句来解决这个问题。

SQL表和结果集(没有ORDER BY)表示无序集。排序是任意的,反复无常。它可以从查询执行到查询执行。

这个查询:

SELECT SQL_CALC_FOUND_ROWS *
FROM test
WHERE test_customer = '1'
LIMIT 4 OFFSET 4;

Returns 任意 4 行给客户。 OFFSET 没有任何意义。

如果您想要特定顺序的数据,请使用 ORDER BY。否则,数据的顺序可以随查询执行的不同而变化。没有"default ordering".

所以:

SELECT SQL_CALC_FOUND_ROWS *
FROM test
WHERE test_customer = 1
ORDER BY testid
LIMIT 4 OFFSET 4;

请注意,我从 = 中删除了单引号。该值为整数,因此请使用数值常量。