2009-12-03 125 views
0

我'试图了解是什么原因导致以下,也许你能帮助我:MySQL的联合声明与ORDER BY

我有这样一个查询:

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之前。 有人知道为什么会发生这种情况吗?

感谢, 问候

回答

3

基于你不明确排序的任何字段的顺序是不确定的,如果它认为导致更好的执行计划,优化程序可以更改排序。给定两个行按照字段顺序完全相同的值,除非您明确命令具有不同值的另一个字段,否则不能依赖于它们之间的任何特定顺序。

+0

我也很想知道,很高兴知道... – cssmaniac

-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 
+0

我看到我的查询结构有问题,谢谢。无论如何,订单仍然应该是相同的,实际上在纠正查询后,订单仍然不同。我在这两个查询中做的唯一不同的是额外的领域!任何想法?谢谢 – resig

+0

您无法保证从查询返回的数据的顺序,因此您必须显式设置顺序依据子句。 – Rippo

+0

但我按顺序做。它只是为两个查询命令不同。我不明白为什么...... – resig

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 
0

直接从MySQl手册,到用户订单通过一个联合,你必须括括单独的表。

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

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

对于每个查询执行,具有相同fieldDate的行的顺序可能不同。通常这个顺序是一样的,但你不应该依赖它。如果你想要任何额外的订单状态更多按字段排序。