Я бы предпочел, чтобы вы 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
.