mysql возвращает пропущенную строку в заказе с той же датой и временем - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть запрос MySQL, который выглядит следующим образом:

SELECT
    *
FROM posts
ORDER BY createdAt DESC;

и возвращается с этим:

enter image description here

Ожидаемые результаты.

Но когда я добавляю условие LIMIT and OFFSET, оно пропускает строки.

Пример:

SELECT
    *
FROM posts
ORDER BY createdAt DESC
LIMIT  5
OFFSET 2;

Результат:

enter image description here


Я ожидаю, что он должен вернуть идентификаторы 20, 19, 18, 17, 13, вместо этого он пропустил некоторые строки, почему это так? Я не уверен, что это дата, которая выдает MySQL, или это из-за моего запроса.

1 Ответ

0 голосов
/ 26 февраля 2020

Если некоторые записи имеют одинаковое значение для выражения, используемого для сортировки, они возвращаются в случайном порядке. Т.е. сортировка внутри такой группы недетерминирована c.

Записи 6-11 в вашем выводе (идентификаторы 13,16,15,14,12,11) имеют то же значение в поле, используемом для сортировка. И сортировка этих записей в этой группе является случайной, и она может измениться в любое время - даже при следующем выполнении запроса.

При использовании LIMIT только одна из этих 6 записей соответствует указанному региону номеров записей. И эта одна запись из всех 6 возможных выбирается случайным образом. Сегодня выбрано id = 12, завтра это может быть какой-то другой - снова недетерминированный c.

Если вам нужен детерминированный c порядок сортировки, записи должны быть уникальными по выражению сортировки. Измените его, например, на ORDER BY createdAt DESC, id - и ваша проблема исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...