我想在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
但是这非常低效,因为查询必须遍历所有字段才能对伪造字段进行排序。 你知道任何解决方法吗?
谢谢
答案 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)
首先,请勿使用UNION
但UNION ALL
。 UNION
将删除所有重复项,因此可能会对数据进行排序。
此外,SQL查询的全局语法属于这种类型:
sql_query: compound_statement [order_by_clause]
compound_statement: select_statement [ set_operator compound_statement ]
因此,您只能使用Order By
或UNION
之后评估的一个INTERSECTION
。如果要对部分结果进行排序,请使用子查询。