从日期中选择10行向前和10向后

时间:2013-04-23 10:30:59

标签: mysql sql union

我试图从今天的日期开始在任意一个方向(前进和后退)和日期顺序中选择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;

有更好/更有效的方法吗?

感谢。

2 个答案:

答案 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子句,因此您实际上需要进一步子查询显示的AB部分。此外,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)