По сути, MySQL не сохраняет порядок записей из подзапроса, используя конструкцию «Объединение». После небольшого исследования я обнаружил, что это работает, если мы добавляем предложение limit или имеем вложенные запросы. Итак, ниже приведены два подхода:
Подход-1: пункт об использовании лимита
select columnA1, columnA2 from tableA order by [columnA3] asc Limit 100000000
union distinct
select columnB1, columnB2 from tableB
Я проверил это поведение, используя несколько наборов данных, и, похоже, оно работает последовательно. Также есть ссылка на это поведение в документации MySQL (http://dev.mysql.com/doc/refman/5.1/en/union.html):
«Использование ORDER BY для отдельных операторов SELECT ничего не говорит о порядке, в котором строки появляются в конечном результате, потому что UNION по умолчанию создает неупорядоченный набор строк. Следовательно, использование ORDER BY в этом контексте обычно связано с LIMIT, так что он используется для определения подмножества выбранных строк, которые нужно извлечь для SELECT, даже если это не обязательно влияет на порядок этих строк в окончательный результат UNION. Если ORDER BY появляется без LIMIT в SELECT, он оптимизируется, потому что он все равно не будет иметь никакого эффекта. ”
Обратите внимание, что нет особой причины при выборе LIMIT в 10000000000, кроме наличия достаточно большого числа, чтобы обеспечить охват всех случаев.
Подход-2: вложенный запрос, подобный приведенному ниже, также работает.
select column1, column2 from
( select column1, column2 order by [columnA3] asc ) alias1
union distinct
( select column1, column2 from tableB )
Я не смог найти причину для работы вложенного запроса. В Интернете были некоторые ссылки (например, от Фила МакКарли в http://dev.mysql.com/doc/refman/5.0/en/union.html), но нет официальной документации от MySQL.