使用MySQL的UNION中每个SELECT的ORDER BY不同

时间:2010-06-27 18:27:16

标签: php mysql

使用PHP和MySQL,有没有办法为UNION中的每个SELECT语句使用不同的ORDER BY?

SELECT * FROM the_table WHERE color = 'blue' ORDER BY price ASC LIMIT 5
UNION ALL
SELECT * FROM the_table WHERE color = 'red' ORDER BY RAND() LIMIT 10

以上陈述不起作用。看来你只能对最终结果集进行ORDER BY。有没有办法在第一个SELECT上执行ORDER BY,然后使用UNION在第二个SELECT上执行不同的ORDER BY?

2 个答案:

答案 0 :(得分:10)

(SELECT * FROM the_table WHERE color = 'blue' ORDER BY price ASC LIMIT 5)
UNION ALL
(SELECT * FROM the_table WHERE color = 'red' ORDER BY RAND() LIMIT 10)

答案 1 :(得分:8)

请注意,如果您未指定LIMIT,则此功能不起作用(尽管您可以指定非常大的虚拟限制)。请参阅mysql文档(13.2.7.3.UNION语法):

“对单个SELECT语句使用ORDER BY并不意味着行在最终结果中出现的顺序,因为UNION默认生成一组无序行... “要使UNION结果中的行由每个SELECT一个接一个地检索的行组成,请在每个SELECT中选择一个附加列以用作排序列,并在最后一个SELECT后添加ORDER BY:

“(SELECT 1 AS sort_col,col1a,col1b,... FROM t1) 联盟 (SELECT 2,col2a,col2b,... FROM t2)ORDER BY sort_col; 要在单个SELECT结果中另外维护排序顺序,请在ORDER BY子句中添加辅助列:

“(SELECT 1 AS sort_col,col1a,col1b,... FROM t1) 联盟 (SELECT 2,col2a,col2b,... FROM t2)ORDER BY sort_col,col1a;“