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
需要从 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