mysql union 语句与 order by

Posted

技术标签:

【中文标题】mysql union 语句与 order by【英文标题】:mysql union statement with order by 【发布时间】:2009-12-03 13:58:02 【问题描述】:

我正在尝试了解导致以下问题的原因,也许您可​​以帮助我:

我有一个类似的查询:

 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 之前。 有人知道为什么会这样吗?

谢谢, 问候

【问题讨论】:

【参考方案1】:

基于您未明确排序的任何字段的排序是未定义的,如果优化器认为这会产生更好的执行计划,则可以更改排序。给定两行在 order by 字段中具有完全相同的值,您不能依赖它们彼此之间的任何特定顺序,除非您明确地按具有不同值的另一个字段排序。

【讨论】:

【参考方案2】:

你能做到吗

  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

【讨论】:

【参考方案3】:

直接来自 mysql 手册,用户通过联合订购,您必须在各个表中加上括号。

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

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

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

【讨论】:

【参考方案4】:

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


您的 order by 仅适用于 union 的第二部分。您可以使用子查询对整个联合进行排序:

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

【讨论】:

我发现查询结构有问题,谢谢。无论如何,顺序应该仍然相同,实际上在更正查询后顺序仍然不同。我在两个查询中唯一不同的是额外的字段!任何的想法?谢谢 您不能保证从查询返回的数据的顺序,因此您必须明确设置 order by 子句。 但我是按顺序来的。它只是对两个查询进行不同的排序。我不明白为什么...... @resig:Rippo 说的是,在您的查询中,只有联合的第二部分有排序依据。所以第一部分的顺序是随机的。 但正如我在之前的评论中所说,我已经改变了它,但我仍然得到不同的结果..

以上是关于mysql union 语句与 order by的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中union和order by一起使用的方法

在 mysql 中使用 union 和 order by 子句

MySQL中Union子句不支持order by的解决方法

各位大神,怎么在sql语句union中使用order by?

order by 和union all 如何共存

ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束