Сравнение дат в подзапросе не дает результатов - PullRequest
0 голосов
/ 21 июля 2011

У меня есть запрос 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» результаты по какой-то причине не перезапускаются.

Странно, если я переключаю <в a> вчасть 'prev', которая затем возвращает (явно неверный) результат, поэтому есть проблема с сопоставлением этих двух дат:

Я в своем уме, если честно, понятия не имею, что это может быть...

1 Ответ

1 голос
/ 21 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...