0

我试图从今天的日期中以任一方向(时间向前和向后)和日期顺序选择 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;

有没有更好/更有效的方法来做到这一点?

谢谢。

4

2 回答 2

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将确保此查询尽可能快。

于 2013-04-23T10:55:29.963 回答
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)
于 2013-04-23T11:22:52.590 回答