Продолжаю работать над блогом. И вот захотел я сделать под каждой статьей ссылки на предыдущую и на следующую, чтобы можно было листать статьи не переходя к ленте. Давно, знаете ли, руки чесались сделать это и вот они (руки) дошли. И сразу встал вопрос: а как, зная id элемента в таблице, узнать id его ближайших соседей, пригодных к выводу, в один запрос?
Первое что приходит в голову — вычесть и прибавить единицу. Но во-первых, никто не гарантирует, что запись с номером 150-1 есть в базе, а во-вторых, что она пригодна к публикации (у меня есть флаг, показывающий нужно ли показывать статью пользователям или нет).
Полез я в интернет, порылся там и удивился — люди узнают соседние id двумя запросами. Неужели нет спортивного интереса? Так вот, я сконструировал-таки запрос.
SELECT * FROM `states` WHERE (
`id` = (SELECT MAX(`id`) FROM `states`WHERE `id` <$quoted_id)
OR `id` = (SELECT MIN(`id`) FROM `states` WHERE `id` >$quoted_id)
)
Как видно, здесь есть два вложенных запроса. Один выбирает максимальный id из тех, что меньше текущего, а другой — минимальный из тех, что больше.
Можно вводить дополнительные условия. Например, если в таблице содержится каталог программ, то мы можем запросить соседние id только для программ для windows 7:
SELECT * FROM `states` WHERE (
`id` = (SELECT MAX(`id`) FROM `states`WHERE `id` <$quoted_id AND `win7`=1)
OR `id` = (SELECT MIN(`id`) FROM `states` WHERE `id` >$quoted_id AND `win7`=1)
)
Вот так легко и просто можно узнать id соседних записей. А результат вы можете видеть прямо под этой статьей.