按日期排序 UNION ALL 上的选择查询

Posted

技术标签:

【中文标题】按日期排序 UNION ALL 上的选择查询【英文标题】:Order by date a select query on UNION ALL 【发布时间】:2013-10-13 20:56:02 【问题描述】:

我的 mysql 查询没有什么问题: 我有两张桌子:

表格时间线

id | date      |  text
1    2013-10-13   Hello

代表

id | date      | text
1   2013-10-12   Its me again
1   2013-10-11   What?
1   2013-10-10   Lorem ipsum

我正在做的是UNION ALL 时间线和代表。第一行应始终是时间线中的行(始终是一行),然后是代表表中的所有行,但按DESC 顺序。

我的查询是以下一个(除了 order by 之外其他都可以)

select id,date,text from timeline UNION ALL select * from reps order by date desc

想像评论(位于顶部)这样的评论,按 desc 顺序回复评论,最新的在前。

提前谢谢你。

【问题讨论】:

【参考方案1】:

将 UNION 放在子查询中:

SELECT id, date, text
FROM (SELECT id, date, text, 1 AS priority
      FROM timeline
      UNION ALL
      SELECT *, 2 AS priority
      FROM reps) u
ORDER BY priority, date DESC

【讨论】:

你必须先按id订购 @Jonysuise 嗯?为什么会这样? 我在问题中没有看到任何提及。他说时间线只有一排。我怀疑他的实际查询在两个子查询中都有 where id = ...,所以他没有显示所有 ID。 假设reps表的id是timelines表的id的fk...:( 工作就像魅力!也感谢所有其他人!【参考方案2】:

您的查询是正确的,您只需像这样通过 () 关闭第二个查询:它只会订购第二个查询。没有 () 它将对两个查询进行排序。

   select id,date,text from timeline 
    UNION all
  (select * from reps order by date desc)

【讨论】:

不是我的反对意见,但UNION ALL 会保证左侧的结果先于右侧的所有结果吗? @JoachimIsaksson 如果您先选择它,那么它首先出现。【参考方案3】:

根据日期值创建一个 Unix_timestamp 并按其值排序。

 SELECT -1 as 'id' , 99999999999999 as 'sortalias' , now() as 'datum||date'
 UNION
 ( SELECT
      id
      ,unix_timestamp(datum) as 'sortalias'
      ,datum as 'datum||date'
      FROM kunde
 )
 order by sortalias desc

【讨论】:

【参考方案4】:
select id,date,text from (
    select id,1 poid,date,text
    from timeline
    union all
    select id,2 poid,date,text
    from reps
) t
order by t.id asc,t.poid asc,t.date desc

【讨论】:

以上是关于按日期排序 UNION ALL 上的选择查询的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在没有子查询的 UNION ALL 中按一个查询排序

MySQL union all排序问题

mysql数据库多个表union all查询并排序的结果为啥错误

UNION ALL、TEXT 字段和 ORDER BY 错误

mysql数据库多个表union all查询并排序的结果为啥错误

union和union all