Объясните поведение MySQL, связанное с ORDER BY и LIMIT

В таблице `products` поле `position` для всех строк равно 0. Общее количество записей - 2694. При выборке строк из БД с использованием limit и offset где-то после 837-й строки наблюдается "реверс" в таком смысле, что выборка первых 100(например) записей пересекается с выборкой последних 100

Два запроса:

SELECT * 
FROM  `products` 
WHERE 1 
ORDER BY  `position` DESC 
LIMIT 800 , 38


и

SELECT * 
FROM  `products` 
WHERE 1 
ORDER BY  `position` DESC 
LIMIT 800 , 37


отличаются первыми 37 строками, хотя по логике(по интуиции) не должны.

Проясните, пожалуйста, с чем связано такое поведение?
  • Вопрос задан
  • 2950 просмотров
Решения вопроса 1
Finesse
@Finesse
Одно из основных положений теории баз данных гласит, что если не задана сортировка, то данные могут выдаваться в абсолютно любом порядке. У вас сортировка идёт по полю, для которого значение всех записей совпадает, и данные не сортируются.

Чтобы этого избежать, добавьте ещё одну сортировку по первичному ключу или любому другому полю с уникальными значениями, например (не знаю названия ключевого поля в вашей таблице, замените `id` на него):
SELECT * 
FROM  `products`
ORDER BY `position` DESC, `id` ASC
LIMIT 800 , 38
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
В таблице `products` поле `position` для всех строк равно 0

Вы сортируете по одинаковому полю? А потом ожидаете какого-то «логичного» поведения? Если все действительно так, как вы говорите, то сортировка в запросе отсутствует по сути. Сортировка по-умолчанию в общем случае не определена, поэтому даже случайно отсортированные выборки, меняющиеся от запроса к запросу, могут считаться нормальным поведением.
Ответ написан
svd71
@svd71
А что вернет
SELECT *
FROM `products`
WHERE 1
ORDER BY `position` DESC
LIMIT 800  OFFSET 38


и

SELECT *
FROM `products`
WHERE 1
ORDER BY `position` DESC
LIMIT 800 OFFSET 37


?
Ответ написан
@CloudMonster
Условие правильно пишите!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы