Поведение, которое вы описываете, происходит, когда вы ORDER BY
выражаете выражение, отсутствующее в предложении SELECT
.Стандарт SQL не допускает такой запрос, но MySQL менее строг и разрешает его.
Давайте попробуем пример:
SELECT DISTINCT colum1, column2
FROM table1
WHERE ...
ORDER BY column3
Допустим, содержимое таблицы table1
:
id | column1 | column2 | column3
----+---------+---------+---------
1 | A | B | 1
2 | A | B | 5
3 | X | Y | 3
Без предложения ORDER BY
приведенный выше запрос возвращает следующие две записи (без ORDER BY
порядок не гарантируется):
column1 | column2
---------+---------
A | B
X | Y
Но с ORDER BY column3
заказ также не гарантирован.
Предложение DISTINCT
работает со значениями выражений, присутствующих в предложении SELECT
.Если строка # 1 обрабатывается первой, то (A
, B
) помещается в набор результатов и связывается со строкой # 1.Затем, когда строка № 2 обрабатывается, значения выражений SELECT
создают запись (A
, B
), которая уже находится в наборе результатов.Из-за DISTINCT
оно сброшено.Строка # 3 производит (X
, Y
), которая также помещается в набор результатов.Затем в предложении ORDER BY column3
записи сортируются в результирующем наборе как (A
, B
), (X
, Y
).
Но если строка № 2 обрабатываетсязатем перед строкой # 1, следуя той же логике, что и в предыдущем абзаце, записи в наборе результатов сортируются как (X
, Y
), (A
, B
).
На ядро базы данных не накладывается никаких правил в отношении порядка, в котором он обрабатывает строки при выполнении запроса.База данных может свободно обрабатывать строки в любом порядке, который, по ее мнению, лучше для производительности.
Ваш запрос недопустим в SQL, и тот факт, что он может возвращать разные результаты, используя одни и те же входные данные, подтверждает это.