2011-07-20 80 views
0

我有一個MySQL查詢:比較日期子查詢不返回任何結果

SELECT some_fields, 
     (SELECT slug 
      FROM photos 
      WHERE date_added > p.date_added 
      ORDER BY date_added ASC 
     ) AS next, 
     (SELECT slug 
      FROM photos 
      WHERE date_added < p.date_added 
      ORDER BY date_added DESC 
     ) AS prev 
    FROM photos p 
    WHERE slug = 'test' 

爲了得到一些照片,從一個表,下一個和以前的圖像在同一查詢一起標記。如果我刪除它運行的查詢的'prev'部分並返回一個結果,但是由於某些原因,'prev'部分沒有結果重新生成。奇怪的是,如果我將<切換到'prev'部分中的一個>然後返回(明顯不正確的)結果,所以在比較那兩個日期時有問題。

我在我束手無策,說實話,不知道它可能是......

+0

如果你在子查詢中選擇top 1,會發生什麼? –

+0

我不確定該語法適用於MySQL。是MSSQL嗎? – Simon

+0

哦,是的,我認爲它是[限制1](http://dev.mysql.com/doc/refman/5.0/en/select.html) –

回答

1

我更喜歡你JOINPhotos表本身,尤其是因爲沒有任何事物都有一個「未來「照片,所以你實際上想要一個外部連接。下面是不起作用的查詢:

SELECT some_fields, next.slug, prev.slug 
FROM photos current 
LEFT JOIN photos next ON (current.date_added < next.date_added) 
LEFT JOIN photos prev ON (current.date_added > prev.date_added) 
WHERE current.slug = 'test' 

它失敗,因爲它返回的所有照片,三元其中中間的一個是其他兩個之間。爲了讓他們成爲「下一個」和「前一個」,我們還可以嘗試在我們當前和下一個之間以及我們當前和前一個之間找到照片,並確保不存在這樣的照片!

SELECT some_fields, next.slug, prev.slug 
FROM photos current 
LEFT JOIN photos next ON (current.date_added < next.date_added) 
LEFT JOIN photos prev ON (current.date_added > prev.date_added) 
LEFT JOIN photos betternext ON (current.date_added < betternext.date_added 
          AND betternext.date_added < next.date_added) 
LEFT JOIN photos betterprev ON (current.date_added > betterprev.date_added 
          AND betterprev.date_added > prev.date_added) 
WHERE current.slug = 'test' 
AND betternext.slug IS NULL 
AND betterprev.slug IS NULL 

這將確保您nextprev記錄是最好的 - 沒有betternext並沒有betterprev

+0

那麼工作,謝謝。我只是有點擔心網站的性能,所以想要保持最低限度的連接,所以我想避免這麼多連接。瘋狂的事情似乎是在類似的桌子上工作。 – Simon

+0

+1徹底! – Bohemian