2013-04-23 70 views
0

我試圖從今天的日期中以任一方向(向前和向後的時間)和日期順序選擇10行。迄今爲止我所得到的最好的是:從日期中選擇10行向前和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

了'爲了by'條款必須包含兩個子查詢。 – didierc 2013-04-23 10:35:35

+0

我剛剛注意到,並添加了它!謝謝 – 2013-04-23 10:37:08

+0

沒有更多的數據集內部邏輯的知識,我不認爲你可以比這更好。 – didierc 2013-04-23 10:40:31

回答

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上的索引將確保此查詢速度儘可能快。

+0

會給這個去。謝謝! – 2013-04-23 12:54:15

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) 
+0

那不會按照正確的順序返回行嗎? – 2013-04-23 12:53:14