2015-06-08 42 views
0

我有一個恆定的時間戳18040986(在我的查詢中它的$ readtime)。MYSQL:可以選擇相對於X> X的最近時間戳。如果沒有,那麼結果應該是最接近的<X?

現在我的表有很多條目,每個條目都有自己的時間戳。

我想高效地搜索以找到大於恆定時間戳的時間戳,但也是最接近該時間戳的時間戳。 (本質上,我試圖找到用戶的第一個未讀條目)

現在的訣竅是,說沒有任何條目,那麼我很想得到最近的時間戳,小於當前時間戳(即最近的舊條目已被閱讀)

我希望能夠通過查詢獲得幫助。我迄今爲止所做的基本查詢要麼非常低效,而且會使我的服務器變慢或者不準確。我現在使用的查詢是這樣的

    SELECT postid 
        FROM theposts 
        WHERE category = '$tid' AND visible='1' AND dateline > '$readtime' 
        LIMIT 1 

但我擔心的是,上面的查詢不會實際上返回更大然後我readtime下一個最近的帖子ID,如果由於某種原因,我的表中有項無序一天

+0

所以你的常量是一個變量?無論如何,請參閱UNION。 – Strawberry

回答

0

我會傾向於這樣做:

(SELECT p.postid 
FROM theposts p 
WHERE p.category = '$tid' AND p.visible='1' AND p.dateline > '$readtime' 
ORDER BY p.dateline 
LIMIT 1 
) UNION ALL 
(SELECT p.postid 
FROM theposts p 
WHERE p.category = '$tid' AND p.visible='1' AND p.dateline < '$readtime' AND 
     NOT EXISTS (SELECT 1 
        FROM theposts p 
        WHERE p.category = '$tid' AND p.visible='1' AND 
         p.dateline > '$readtime' 
       ) 
ORDER BY p.dateline DESC 
LIMIT 1 
) 

爲了表現,您需要theposts(category, visible, dateline)上的索引。

如果性能是不成問題的,下面是編寫查詢一個簡單的方法:

SELECT p.postid 
FROM theposts p 
WHERE p.category = '$tid' AND p.visible='1' AND 
ORDER BY (p.dateline > '$readtime') DESC, 
      (case when p.dateline > '$readtime' then p.dateline end) ASC, 
      p.dateline DESC 
LIMIT 1 

在這個版本中,不過,我看不出有order by使用索引。

0

如:

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT * 
    FROM 
    (
     (SELECT * FROM ints WHERE i > 8 ORDER BY i LIMIT 1) 
     UNION 
     (SELECT * FROM ints WHERE i < 8 ORDER BY i DESC LIMIT 1) 
    ) x 
ORDER BY i DESC LIMIT 1; 
+---+ 
| i | 
+---+ 
| 9 | 
+---+ 
相關問題