Скажем, у меня есть записи с идентификаторами 3,4,7,9, и я хочу иметь возможность переходить от одной к другой с помощью навигации по следующим / предыдущим ссылкам. Проблема в том, что я не знаю, как получить запись с ближайшим более высоким идентификатором.
Поэтому, когда у меня есть запись с ID 4, мне нужно иметь возможность получить следующую существующую запись, которой будет 7. Запрос, вероятно, будет выглядеть примерно так:
SELECT * FROM foo WHERE id = 4 OFFSET 1
Как я могу получить следующую / предыдущую запись без получения всего набора результатов и ручного выполнения итерации?
Я использую MySQL 5.
Ответы:
следующий:
предыдущая:
источник
В дополнение к раствору Джемкаленку :
следующая запись:
предыдущая запись:
edit: Поскольку в последнее время этот ответ получил несколько голосов, я действительно хочу подчеркнуть комментарий, который я сделал ранее о понимании того, что столбец первичного ключа не предназначен для сортировки, потому что MySQL не гарантирует, что более высокое, автоматически увеличивающееся , значения обязательно добавляются позже.
Если вас это не волнует и вам просто нужна запись с более высоким (или более низким),
id
этого будет достаточно. Только не используйте это как средство, чтобы определить, действительно ли запись добавлена позже (или раньше). Вместо этого рассмотрите возможность использования, например, столбца datetime для сортировки.источник
Все вышеперечисленные решения требуют двух вызовов базы данных. Приведенный ниже код sql объединяет два оператора sql в один.
источник
DISTINCT
раньше*
сделает его еще лучше, то есть, конечно, если этоid
может иметь0
значение.id
а не две.источник
SELECT * FROM foo WHERE id<4 ORDER BY id DESC LIMIT 1
для предыдущего рекордаЯ пытался сделать что-то подобное, но мне нужны были результаты, упорядоченные по дате, поскольку я не могу полагаться на поле идентификатора как на сортируемый столбец. Вот решение, которое я придумал.
Сначала узнаем индекс нужной записи в таблице, когда она отсортирована так, как мы хотим:
Затем уменьшите результат на 2, поместите его в оператор limit. Например, результат выше вернул мне 21, поэтому я бегу:
Предоставляет вам вашу основную запись вместе со следующей и предыдущей записями в соответствии с указанным вами порядком.
Я попытался сделать это как один вызов базы данных, но не смог заставить оператор LIMIT принять переменную в качестве одного из параметров.
источник
Попробуйте этот пример.
Примечание. Если значение не найдено, возвращается значение null .
В приведенном выше примере предыдущее значение будет Raja, а следующее значение будет нулевым, потому что следующего значения нет.
источник
Используя подход @Dan, вы можете создавать СОЕДИНЕНИЯ. Просто используйте разные @variable для каждого подзапроса.
источник
current
->current_row
&previous
->previous_row
.Следующая строка
Предыдущая строка
образец следующей строки
образец предыдущей строки
источник
У меня была та же проблема, что и у Дэна, поэтому я использовал его ответ и улучшил его.
Сначала выберите индекс строки, здесь ничего особенного.
Теперь используйте два отдельных запроса. Например, если индекс строки равен 21, запрос для выбора следующей записи будет:
Чтобы выбрать предыдущую запись, используйте этот запрос:
Имейте в виду, что для первой строки (индекс строки равен 1) предел будет равен -1, и вы получите ошибку MySQL. Вы можете использовать оператор if, чтобы предотвратить это. Только не выбирайте ничего, так как предыдущей записи все равно нет. В случае последней записи будет следующая строка, поэтому результата не будет.
Также имейте в виду, что если вы используете DESC для упорядочивания, вместо ASC, ваши запросы на выбор следующей и предыдущей строк остаются такими же, но переключаются.
источник
Это универсальное решение для условий с большим количеством одинаковых результатов.
источник
Здесь у нас есть способ получить предыдущие и следующие записи, используя один запрос MySQL. Где 5 - это идентификатор текущей записи.
источник
Как получить следующую / предыдущую запись в MySQL и PHP?
Мой пример - получить только идентификатор
источник
Оптимизация подхода @Don для использования только одного запроса
измените CurrentArticleID на текущий идентификатор статьи, например
источник
Есть еще один трюк, который вы можете использовать для отображения столбцов из предыдущих строк, используя любой порядок, который вы хотите, используя переменную, аналогичную трюку @row:
По-видимому, выбранные столбцы оцениваются по порядку, поэтому сначала будут выбраны сохраненные переменные, а затем обновлены переменные до новой строки (выбрав их в процессе).
NB: Я не уверен, что это определенное поведение, но я использовал его, и оно работает.
источник
Если вы хотите скормить более одного
id
запроса и получитьnext_id
для всех ...Назначьте
cur_id
в поле выбора, а затем подайте его в подзапрос, попадаяnext_id
в поле выбора. А затем выберите простоnext_id
.Используя длинный ответ для вычисления
next_id
:источник
источник
Если у вас есть столбец индекса, например id, вы можете вернуть предыдущий и следующий id в одном запросе sql. Замените: id своим значением
источник
Мое решение получить следующую запись и превью также, чтобы вернуться к первой записи, если я нахожусь на последней, и наоборот
Я не использую идентификатор, я использую заголовок для красивого URL
Я использую Codeigniter HMVC
источник
Вот мой ответ. Я беру идею из « Достойного любителя » и добавляю часть, которая проверяет, находится ли id между min (id) и max (id). Вот часть для создания моей таблицы.
);
Следующим шагом является создание хранимой процедуры, которая отвечает за получение предыдущего идентификатора.
Первый способ хорош, если индексы отсортированы, но если нет. Например, если у вас есть индексы: 1,2,7 и вам нужно получить индекс номер 2 таким образом, гораздо лучше использовать другой подход.
источник
100% рабочий
источник
Я думаю, что для реальной следующей или предыдущей строки в таблице SQL нам нужно реальное значение с равным, (<или>) вернуть более одного, если вам нужно изменить положение строки в таблице заказа.
нам нужно значение
$position
для поиска вneighbours
строке В моей таблице я создал столбец «позиция»и SQL-запрос для получения нужной строки:
для следующего:
для предыдущего:
источник
Выберите верхний 1 * из foo, где id> 4, порядок по id asc
источник
select * from foo where id>4 order by id asc LIMIT 1