【问题标题】:Merge two select statement without ordering合并两个不排序的select语句
【发布时间】:2019-01-08 15:11:36
【问题描述】:

有一个表TableX(id, user_id, sticky_date, created_at)

其中很少有条目具有固定日期。

我试图得到结果,

result 将包含所有具有 sticky_date 顺序 desc 的条目,然后所有剩余条目按 created_at 顺序排列。

我尝试了以下查询,

(SELECT * FROM TableX ORDER BY sticky_expiry_date)
UNION 
( select * from TableX order by created_at desc)

但是在 union created_at 没有按预期工作之后。有没有办法在单个查询中做这些事情。

【问题讨论】:

  • 你可以在order bystackoverflow.com/a/19487675/2845389中使用case statement
  • 但是 union created_at 没有按预期工作你能显示示例数据,你得到的结果和预期的结果吗?
  • SELECT * FROM TableX ORDER BY sticky_expiry_date, created_at desc
  • i.stack.imgur.com/iC18o.png @jens 在这个结果中应该是 1,3,2 因为 created_at 的顺序在结果集中是错误的。

标签: mysql


【解决方案1】:

我们可以使用计算列来做到这一点:

SELECT *
FROM
(
    SELECT *, 0 AS position, UNIX_TIMESTAMP(sticky_expiry_date) AS odr
    FROM TableX
    UNION     -- UNION ALL ?
    SELECT *, 1, -UNIX_TIMESTAMP(created_at)
    FROM TableX
) t
ORDER BY
    position, odr;

这里的想法是position 别名会跟踪联合的哪一半应该先出现。然后,odr 别名跟踪联合中每一半的排序。上半部分使用sticky_expiry_date 作为odr 别名,而后半部分使用created_at。为了处理日期升序/降序的问题,我们可以将日期列包裹在UNIX_TIMESTAMP 中,并按该数量(升序)或否定数量(降序)进行排序。

【讨论】:

  • i.stack.imgur.com/iC18o.png 输出如上所示,created_at 的顺序是错误的。
  • 重新加载您的页面,因为我已经编辑了几次答案。
猜你喜欢
  • 2010-11-24
  • 2010-10-16
  • 2011-02-19
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多