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. Нет сортировки — нет верха. Есть десять первых прохожих.
«Список без сортировки — не рейтинг. Это очередь, которую никто не строил.»
Список без сортировки — очередь. Постройте настоящий рейтинг на любом деле архива и сравните, кто в нём окажется сверху.