使用SQL UNION查询进行排序

时间:2011-11-09 09:44:36

标签: mysql sql union

我想在MySQL中添加两个查询。我发现UNION可以帮助我这样做,但它并不完美,因为它不保留每个附加查询的顺序。很明显,我想这样做:

(SELECT name,city FROM people WHERE xxx ORDER BY yyy) 
UNION 
(SELECT name,city FROM people WHERE zzz ORDER BY www)

但是当存在UNION

时,SQL不会在ORDER语句上执行

一种解决方案是在每个子查询中添加一个虚假字段,然后按该字段排序:

(SELECT name,city,'0' as bogus FROM people WHERE xxx) 
UNION 
(SELECT name,city,'1' as bogus FROM people WHERE zzz) 
ORDER by bogus ASC, wwwzzz

但是这非常低效,因为查询必须遍历所有字段才能对伪造字段进行排序。 你知道任何解决方法吗?

谢谢

3 个答案:

答案 0 :(得分:1)

您是否尝试使用UNION ALL而不是UNION

请参阅:http://dev.mysql.com/doc/refman/5.0/en/union.html

e.g:

(SELECT name,city,'0' as bogus FROM people WHERE xxx) 
UNION ALL
(SELECT name,city,'1' as bogus FROM people WHERE zzz) 
ORDER by bogus ASC, wwwzzz

答案 1 :(得分:0)

由于我只对MsSql有经验,所以我完全放弃它,所以请原谅我这是无用的,但是你可以将无序结果集存储到临时表中,然后用所需的订单子句选择吗?或者类似地使union语句成为子/内部查询并将order子句放在外部查询上?

答案 2 :(得分:0)

首先,请勿使用UNIONUNION ALLUNION将删除所有重复项,因此可能会对数据进行排序。

此外,SQL查询的全局语法属于这种类型:

sql_query: compound_statement [order_by_clause]
compound_statement: select_statement [ set_operator compound_statement ]

因此,您只能使用Order ByUNION之后评估的一个INTERSECTION。如果要对部分结果进行排序,请使用子查询。