带有order by的mysql union语句

时间:2009-12-03 13:58:03

标签: mysql

我试图了解导致以下情况的原因,也许你可以帮助我:

我有一个类似的查询:

 select field1,fieldDate from table1 
 union all 
 select field1,fieldDate from table2
 order by fieldDate desc

和另一个像这样:

 select field1,field2,fieldDate from table1 
 union all 
 select field1,field2,fieldDate from table2 
 order by fieldDate desc

所以基本上它们是相同的,除了在第二个我检索一个额外的字段。

现在,两个结果都有不同的排序,但仅适用于日期非常相似的情况。例如,有2行(row1,row2),日期为2009-11-25 09:41:55。对于查询1,row1位于row2之前,而对于查询2,row2位于row1之前。 有人知道为什么会这样吗?

谢谢, 此致

4 个答案:

答案 0 :(得分:3)

基于您未明确排序的任何字段的排序未定义,并且优化器可以在认为导致更好的执行计划时更改排序。如果两个行在order by by字段中具有完全相同的值,则除非您明确地使用具有不同值的另一个字段进行排序,否则不能依赖它们相对于彼此的任何特定顺序。

答案 1 :(得分:0)

你能做到吗

  select * from ( select 
     field1,field2,fieldDate, 0 as ordercol from table1 
    union all select 
     field1,field2,fieldDate, 1 as ordercol from table2) t1
    order by fieldDate desc, ordercol asc

答案 2 :(得分:0)

直接从MySQl手册到用户订单,你必须在各个表格中加上括号。

(select field1,fieldDate from table1)
union all 
(select field1,fieldDate from table2)
order by fieldDate desc

这不符合SQL标准!您输入的代码应该命令两个表的并集,但令我惊讶的是MySQL具有上述语法。

返回具有相同 fieldDate 的行的顺序可能因每次查询执行而不同。通常这个顺序是相同的,但你不应指望它。如果您想要任何额外的订购状态,请按字段排序。

答案 3 :(得分:-1)

编辑:这个答案是错误的:整个工会的工作顺序。我会把它留在这里以拯救别人的麻烦:)


您的订单仅适用于工会的第二部分。您可以使用子查询通过整个联合工作来生成订单:

select field1,field2,fieldDate 
from (
    select field1,field2,fieldDate 
    from table1 
    union all 
    select field1,field2,fieldDate 
    from table2
) SubQueryName
order by fieldDate desc