На странице для просмотра сообщений я подумал, что было бы неплохо иметь ссылки для следующих и предыдущих сообщений. Я думал, что должен получить эти 3 записи в 1 запросе, так как я такой умный, и у меня было кучу времени, чтобы тратить все равно. Так что, как вы, наверное, догадались, я не мог этого сделать, но мне интересно найти решение. Вот что у меня естьВыберите предыдущие и следующие записи в заявлении о присоединении
SELECT a.id,
a.title,
a.body,
p.id AS prev_id,
p.title AS prev_title,
n.id AS next_id,
n.title AS next_title
FROM posts a
LEFT JOIN posts p
ON p.id < a.id
LEFT JOIN posts n
ON n.id > a.id
WHERE a.id = ?
LIMIT 1
Проблема заключается в том, что для prev_id
и prev_title
я всегда получаю первый запись в таблице. Я попытался добавить ORDER BY
, но на самом деле это не повлияло на соединение. Как я могу выбрать предыдущую, а не первую запись, используя соединение, как в примере?
мы можем предположить, что p.id является последовательный, и когда вы говорите следующее/предыдущее, это следующий использованный идентификатор? поэтому в предыдущем это был бы MAX ID до (<) P.Id, а для N это был бы MIN (ID) после (>) P.ID? Или вы говорите следующую статью в группе, которая может не иметь ничего общего с идентификаторами ... примеры данных структуры таблицы и/или SQLFiddle помогли бы; поскольку ответ зависит от вашей структуры таблицы и используемых данных. – xQbert
@xQbert Нет, это довольно простая таблица, и все, кроме я не хочу жестко кодировать 'a.id - 1' и' a.id + 1' для prev и next, потому что некоторые сообщения могут удаляться и могут возникать пробелы –
Хотя , «следующий» и «предыдущий» полезны для «нас» как людей. Что касается SQL, у него действительно нет понятия «упорядоченного набора (списка)», то есть «выход» процесса обработки вашего запроса. SQL-запросы «знают» о «наборах», которые, к сожалению, не «упорядочены». –