MySQL: условно выбирая следующую и предыдущую строки - PullRequest
5 голосов
/ 04 октября 2008

http://thedailywtf.com/Articles/The-Hot-Room.aspx

Вы видите, как внизу есть ссылки на следующую и предыдущую статьи («Неподготовленный для Divide_By_Zero» и «Совершенно другая игра»)? Как мне это сделать, но выбирать следующие и предыдущие не частные статьи? Это работает для выбора следующей статьи:

SELECT * FROM articles WHERE id > ? AND private IS NULL

Но я не могу найти способ выбрать предыдущую статью.

Каков правильный / эффективный способ сделать это, предпочтительно одним запросом?

Ответы [ 4 ]

9 голосов
/ 04 октября 2008

Или расширяя ответ Джереми ...
В одном запросе

(SELECT * FROM articles WHERE id > ? 
 AND private IS NULL 
 ORDER BY id ASC LIMIT 1) 
UNION 
(SELECT * FROM articles WHERE id < ? 
 AND private IS NULL 
 ORDER BY id DESC LIMIT 1)
5 голосов
/ 04 октября 2008

Вот как бы я это сделал:

-- next
SELECT * FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1

-- previous
SELECT * FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1

Я не уверен, как это сделать в одном запросе. Единственное, о чем я могу подумать, это, возможно, получить как отображаемую статью, так и следующую статью в одном запросе, но это может быть слишком запутанным.

2 голосов
/ 28 декабря 2009

В вашем конкретном случае вы можете избежать вложенных выборок и т. Д., Но если вам нужно что-то более сложное (например: с учетом начального баланса и списка платежей и возвратных платежей, рассчитать остаток на счете в любой момент времени), вы, вероятно, захотите хотите написать хранимую процедуру, которая использует предложения SQL REPEAT / WHILE / LOOP и позволяет использовать переменные и т. д.

2 голосов
/ 04 октября 2008

Как насчет вложенного выбора?

SELECT * FROM articles WHERE id IN (
    SELECT id FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1)
)
OR id IN (
    SELECT id FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...