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 子句
各位大神,怎么在sql语句union中使用order by?
ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束