有一个表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无法按预期工作。有什么方法可以在单个查询中完成这些工作。
答案 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
中,并按该数量(升序)或该负数(降序)进行排序。