合并两个选择语句而不排序

时间:2019-01-08 07:01:02

标签: mysql

有一个表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)

但是在工会之后created_at无法按预期工作。有什么方法可以在单个查询中完成这些工作。

1 个答案:

答案 0 :(得分: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中,并按该数量(升序)或该负数(降序)进行排序。