Protossan
@Protossan
студент

Почему не работает UNION ALL запрос?

Необходимо сделать сложную выборку из таблицы с сортировкой для разных условий. Когда делаю два запроса по отдельности то все работает, а если объединяю, то выводит без сортировок - по росту ключевого поля таблицы
(SELECT * FROM `user` WHERE `user`.`rank_golos` >=22.1 order by `user`.rank_yearnub DESC, `user`.rank_golos DESC) UNION ALL (SELECT * FROM `user` WHERE `user`.`rank_golos` <22.1 and `user`.`rank_golos` >0 order by `user`.rank_golos DESC, `user`.rank_yearnub DESC)

В чем может быть проблема?
  • Вопрос задан
  • 949 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Потому что имеет на то право.
https://dev.mysql.com/doc/refman/5.7/en/union.html
Use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result


select /*payload*/ from user
where rank_golos >0
order by rank_golos >=22.1 desc, 
  if (rank_golos >=22.1, rank_yearnub, rank_golos) desc,
  if (rank_golos >=22.1, rank_golos, rank_yearnub) desc

Если типы rank_golos и rank_yearnub могут быть приведены к общему виду.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Immortal_pony
@Immortal_pony Куратор тега MySQL
Сортируйте результаты объединения запроса.
SELECT
    inner.*
FROM (
    SELECT * FROM `user` WHERE `user`.`rank_golos`>=22.1
    UNION
    SELECT * FROM `user` WHERE `user`.`rank_golos` <22.1 AND `user`.`rank_golos`>0
) AS inner
ORDER BY 
     `inner`.rank_yearnub DESC, 
     `inner`.rank_golos DESC


Хотя в вашем случае вообще никакой UNION не нужен.
SELECT 
    `user` . * 
FROM 
    `user` 
WHERE 
    `user`.`rank_golos`>=22.1
OR 
    (`user`.`rank_golos`<22.1 AND `user`.`rank_golos`>0)
ORDER BY 
     `user`.rank_yearnub DESC, 
     `user`.rank_golos DESC
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы