在mysql中使用union和order by子句

我想通过在mysql查询中使用联合的命令。 我正在根据距离在我的网站上进行search的表格中的不同标准获取不同types的logging。 第一个select查询返回与确切地点search相关的数据。 第二个select查询返回距离search地点5公里内距离的数据。 第三select查询返回距离search地点5-15公里内的距离。

然后即时通过使用联合来合并所有的结果,并显示在页面上的分页。 在“确切的search结果”“5公里范围内的结果”等适当的标题下

现在我想根据id或add_datesorting结果。 但是,当我在我的查询(查询1联合查询2联合查询3由add_date顺序)的末尾添加order by子句。 它对所有结果进行sorting。 但是我想要的是它应该在每个标题下sorting。

您可以通过在每个select中添加一个名为rank的伪列,以便在按照其他条件sorting之前先sorting,例如:

select * from ( select 1 as Rank, id, add_date from Table union all select 2 as Rank, id, add_date from Table where distance < 5 union all select 3 as Rank, id, add_date from Table where distance between 5 and 15 ) a order by rank, id, add_date desc 

你可以使用子查询来做到这一点:

 select * from (select values1 from table1 order by orderby1) as a union all select * from (select values2 from table2 order by orderby2) as b 
 (select add_date,col2 from table_name) union (select add_date,col2 from table_name) union (select add_date,col2 from table_name) order by add_date 

不要忘记,union是一种将logging添加到logging集而不分类或合并(而不是union)的方法。

举个例子:

 select * from ( select col1, col2 from table a <....> order by col3 limit by 200 ) a union all select * from ( select cola, colb from table b <....> order by colb limit by 300 ) b 

它使单个查询更加清晰,并允许您按每个查询中的不同参数进行sorting。 但是,通过使用所选答案的方式,可能会变得更加清晰,这取决于复杂性以及数据的相关程度,因为您正在对这种sorting进行概念化。 它也允许你将查询返回到查询程序,所以它有一个可以sorting或组织的上下文。

但是这样做的好处是快速,不会引入额外的variables,并且可以很容易地将每个查询分离出来,包括sorting。 增加限制的能力只是额外的奖励。

当然,可以随意将联合变成一个联合,并为整个查询添加一个sorting。 或者添加一个人为的id,在这种情况下,这种方式可以很容易地按照每个查询中的不同参数进行sorting,但是它与被接受的答案是一样的。

联合查询只能有一个主ORDER BY子句,IIRC。 为了得到这个,在组成更大的UNION查询的每个查询中,添加一个字段,这个字段将是你为UNIONORDER BYsorting的那个字段。

例如,你可能有类似的东西

 SELECT field1, field2, '1' AS union_sort UNION SELECT field1, field2, '2' AS union_sort UNION SELECT field1, field2, '3' AS union_sort ORDER BY union_sort 

union_sort字段可以是任何你可能想要sorting。 在这个例子中,恰好把第一个表格的第一个表格,第二个表格的第二个结果等等

我得到了一个join联盟的工作。

 (SELECT table1.column1, table1.column2, foo1.column4 FROM table1, table2, foo1, table5 WHERE table5.somerecord = table1.column1 ORDER BY table1.column1 ASC, table1.column2 DESC ) UNION (SELECT ... Another complex query as above ) ORDER BY column1 DESC, column2 ASC 

尝试:

 SELECT result.* FROM ( [QUERY 1] UNION [QUERY 2] ) result ORDER BY result.id 

其中[QUERY 1]和[QUERY 2]是您要合并的两个查询。

这是因为你sorting整个结果集,你应该sorting,联合的每个部分分开,或者你可以使用ORDER BY(东西即子查询距离)那么(东西,即行ID)子句

我试图在工会之前把每个查询的顺序都加上

 (select * from table where distance=0 order by add_date) union (select * from table where distance>0 and distance<=5 order by add_date) 

但似乎没有工作。 实际上并没有从每个select的行内进行sorting。

我认为你需要在外面保留订单,并在订单的where子句中join类似的东西

 (select * from table where distance=0) union (select * from table where distance>0 and distance<=5) order by distance, add_date 

这可能有点棘手,因为你想按范围分组,但我认为这应该是可行的。