我有一个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'部分中返回(显然是不正确的)结果,因此比较这两个日期时间会有问题。
我说实话,我不知道它会是什么......
答案 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
这可确保您的next
和prev
记录最佳 - 没有betternext
和betterprev
。