UNION ALL 结果未正确排序

UNION ALL results are not sorted properly

需要从 table 中进行复杂的选择,并针对不同的条件进行排序。当我分别发出两个请求时,一切正常,如果我合并,它输出而不排序 - 通过 table

的关键字段的增长
(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)

union all 连续输出每个查询的结果 - 您的行将在每个查询结果中 排序 但不是整体。

为了实现整体排序,通过创建外部查询来包装 union all 结果,将 order by 移到 两个查询之外。

要根据结果来自 union all 的哪一半来实现不同的排序,请将有关行来源的信息添加到行中,并使用它来获得特定的排序:

SELECT * FROM (
    SELECT *, 1 as source 
    FROM `user` 
    WHERE `user`.rank_golos >= 22.1 
    UNION ALL 
    SELECT *, 2
    FROM `user` 
    WHERE `user`.rank_golos < 22.1 and `user`.rank_golos > 0
) x
order by
  case when source = 1 then rank_yearnub else rank_golos end DESC,
  case when source = 1 then rank_golos else rank_yearnub end DESC

如果您需要从查询输出中排除 source,您可以包装上面的内容和另一个只选择所有列的外部查询 other 而不是 source.

我也删除了不必要的括号。

我找到了解决方案

select * 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