ORDER BY и LIMIT: топ, которого не было

Вам нужны десять самых крупных клиентов. Вы пишете коротко и уверенно:

SELECT name, total
FROM clients
LIMIT 10;

База послушно отдаёт десять строк. Вы несёте их наверх как «топ-10». Дело уже проиграно, вы просто ещё не знаете.

«Вы просили лучших. Вам выдали ближайших. Разница — в том, кого посадят.»

Почему база отдала не тех?

Таблица не обязана лежать по порядку. Без приказа сортировать база возвращает какие ей удобно — те, что первыми подвернулись под руку. Это не десять главных. Это десять случайных, построенных в шеренгу и подписанных «топ».

LIMIT отрезает десять строк — но не те десять. Нужна верхушка: сперва выстрой очередь, потом отрезай.

SELECT name, total
FROM clients
ORDER BY total DESC
LIMIT 10;

И добавьте второй ключ на случай равных — иначе строки с одинаковой суммой всё равно встанут как попало, и при повторном запросе порядок может смениться:

ORDER BY total DESC, id;

Этой граблей ломается каждый второй дашборд: «топ клиентов», «последние сделки», «худшие по возвратам». Цифры на экране — а под ними случайность. LIMIT отрезает верх, но верх появляется только после ORDER BY. Нет сортировки — нет верха. Есть десять первых прохожих.

«Список без сортировки — не рейтинг. Это очередь, которую никто не строил.»

Список без сортировки — очередь. Постройте настоящий рейтинг на любом деле архива и сравните, кто в нём окажется сверху.

$0
тащи карточки за верхнюю кромку · «+ стикер» · «🧵 нить» — клик по двум

ЛОТОК УЛИК

во вкладке SQL найди подозреваемых и жми «+ доска»

НА ПРОВЕРКУ

теории из «Заметок» отправляются сюда — подтверди на доске или удали
Ctrl+Enter · «+ доска» на строке — выбрать поля и перенестипиши запрос, я подожду
Результат появится здесь.

Картотека

Заметки

Факты

Теории на проверку

Подсказки

◆ РЕЖИМ АРХИВАРИУСАуправление картотекой дел · не виден игроку