我试图从今天的日期开始在任意一个方向(前进和后退)和日期顺序中选择10行。到目前为止我得到的最好的是:
SELECT * FROM (
SELECT * FROM foo WHERE dt >= now() ORDER BY dt ASC LIMIT 10
UNION
SELECT * FROM foo WHERE dt < now() ORDER BY dt DESC LIMIT 10
) ORDER BY dt ASC;
有更好/更有效的方法吗?
感谢。
答案 0 :(得分:0)
你的想法很合理,但这是对它的正确查询。
SELECT * FROM (
SELECT * FROM (SELECT * FROM foo WHERE dt >= now() ORDER BY dt ASC LIMIT 10) A
UNION ALL
SELECT * FROM (SELECT * FROM foo WHERE dt < now() ORDER BY dt DESC LIMIT 10) B
) C
ORDER BY dt ASC;
每个查询级别只允许一个ORDER BY
子句,因此您实际上需要进一步子查询显示的A
和B
部分。此外,UNION ALL避免了排序操作,因为您知道这两个集是不同的。
foo.dt
上的索引将确保此查询尽可能快。
答案 1 :(得分:0)
而不是您可以使用简单 query
(SELECT * FROM one WHERE dt >= now() ORDER BY dt ASC LIMIT 10)
UNION ALL
(SELECT * FROM one WHERE dt < now() ORDER BY dt DESC LIMIT 10)