比较子查询中的日期返回无结果

时间:2011-07-20 21:23:30

标签: mysql sql

我有一个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'部分,由于某种原因没有重新结果。

奇怪的是,如果我切换&lt;到&gt;然后在'prev'部分中返回(显然是不正确的)结果,因此比较这两个日期时间会有问题。

我说实话,我不知道它会是什么......

1 个答案:

答案 0 :(得分:1)

我更喜欢你JOIN你自己的Photos表格,尤其是因为并非所有内容都有“下一张”照片,所以你实际上想要一个外部联接。这是一个不起作用的查询:

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记录最佳 - 没有betternextbetterprev