Оператор set UNION
заставляет операцию «Использование сортировки файлов» идентифицировать и удалять дубликаты.
Оператор набора UNION ALL
объединит два набора результатов, не вызывая операцию сортировки для выявления и удаления дубликатов.
Но просто заменив UNION
на UNION ALL
, мы будем полагаться на поведение, которое не гарантируется. Если нам нужны результаты, возвращаемые в определенном порядке, то в самом внешнем запросе должно быть предложение ORDER BY
.
https://dev.mysql.com/doc/refman/8.0/en/union.html
Выдержка
Однако использование ORDER BY
для отдельных операторов SELECT
ничего не подразумевает в порядке, в котором строки появляются в конечном результате, поскольку UNION
по умолчанию создает неупорядоченный набор строк.
...
(Если кто-то добавит столбец в одну из таблиц, это приведет к сбою этого запроса с несоответствием количества возвращаемых столбцов.)
(Недопустимая ссылка на teacher.status
во втором SELECT.)
(Лично я добавил бы столбец дискриминатора к каждому набору, а затем сослался бы на это в предложении ORDER BY
во внешнем запросе. Я также исключил бы *
в списке SELECT и указал бы столбцы, которые должны быть вернулся.)
Я бы добился указанного результата примерно так:
(
SELECT 'teacher' AS src
, t.fee
, t.fi
, t.fo
, t.fum
FROM `Teacher` t
WHERE t.`status` = 1
)
UNION ALL
(
SELECT 'mission' AS src
, m.one
, m.two
, m.buckle
, m.myshoe
FROM `bouhun`.`missions` m
WHERE m.`status` = 0
)
ORDER
BY src DESC
, CASE src WHEN 'teacher' THEN created_at END DESC
, CASE src WHEN 'mission' THEN RAND() END
* СЛЕДОВАТЬ *
Вопрос был отредактирован, чтобы изменить имя таблицы во втором SELECT таким образом, чтобы оно стало той же самой таблицей, на которую ссылается первый SELECT.
С этим изменением я бы использовал только один SELECT.
И избегайте UNION
/ UNION ALL
из двух комплектов.
Мы можем просто добавить несколько умных выражений в предложение ORDER BY
.
Примерно так:
SELECT t.*
FROM `Teacher` t
WHERE t.status IN (0,1)
ORDER
BY t.status DESC
, IF( t.status=0 , t.created_at , NULL) DESC
, IF( t.status=1 , RAND() , NULL) DESC