[英]Merge two select statement without ordering
有一个表TableX(id,user_id,sticky_date,created_at)
很少有条目具有粘性日期。
我试图得到结果,
结果将包含所有具有 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 没有按预期工作之后。 有什么办法可以在单个查询中做这些事情。
我们可以使用计算列来做到这一点:
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
并按该数量(升序)或该数量否定(降序)排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.