выборка трех записей, где вторая та, которая нужна

-faqer-

Я только учусь
выборка трех записей, где вторая та, которая нужна

Есть таблица с новостями
id|title|content
При прочтении каждой новсоти есть сылки на предыдущую и последующую новости по принципу id-1 и id+1.
Все хорошо. Но в том случае, если вдруг какую либо новость удалили, то при подобной ссылке происходит прыжок в пустоту.
Как сделать выборку с лимитом в три строки, чтобы вторая была с данной новостью, а первая и третья действительно предыдущая и последующая новость вне зависимости от их id
Заранее благодарю
 

Demiurg

Guest
id - это идентификатор а не порядковый номер, поэтому id-1 так же как id+1 смысла иметь не могут.
 

-faqer-

Я только учусь
2 azamat Demiurg
Страница со всеми новостями
PHP:
<?
$rows = mysql_query ("SELECT * FROM news ORDER BY id DESC");
while  ($row = mmysql_fetch_array ($rows)){
?>
<a href="?id=<?=$row['id']?>"><?=$row ['title']]?></a><br><?
}
?>
При просмотре новости
PHP:
<?
$row = mysql_fetch_assoc (mysql_query ("SELECT * FROM news WHERE id = ".$id));
?>
<b><?=$row ['title']?><b><br>
<?=$row ['content']?><br>
<a href="?id=<?=$row ['id']-1?>">Назад</a>  <a href="?id=<?=$row ['id']+1?>">Вперед</a>
?>
Есил не давать при редактировании новстей права на их удаление, то как єто не парадоксально, господа azamat Demiurg
, вышеуказанная схема работает.
А вот если дать право на удаление, то могут возникнуть проблемы, указанные мною в вопросе.
Отсюда и хочется сделать выборку из таблицы news в количестве трех записей, причем ORDER BY id DESC и так, чтоб запись с id=$id была второй по порядку.
Опять же заранее благодарю.
 

-faqer-

Я только учусь
2 Фанат
Каким образом.
Если у предыдущей и последующей новости может быть какой угодно id??
 

Фанат

oncle terrible
Команда форума
ну и что?
единственный способ, по-твоему, запросить запись из базы - это знать ее айди?
 

-faqer-

Я только учусь
Фанат
Очень хотелось бы понимать все с полуслова, но не всегда это выходит
Подскажи, я не понимаю
И снова, заранее благодарю.
 

Фанат

oncle terrible
Команда форума
кроме знака равно, какие еще у нас бывают операторы сравнения?

попробуй визуально представить себе ряд записей.
1 5 9 15 20
текущая - 9.
неужели так сложно выбрать записи, следующие за 9?
и ограничить выборку одной строкой?
 

ForJest

- свежая кровь
Но в том случае, если вдруг какую либо новость удалили, то при подобной ссылке происходит прыжок в пустоту.
Решение (элегантное) - передаёшь вместе с id текущей записи пометку move=[prev|next]

PHP:
$dest = 'ACS';
if (isset($_GET['move']))
{
     $operation = '>';
     if ($_GET['move'] == 'prev')
     {
            $operation = '<';
            $dest = 'DESC';
     }

}
else
{
$operation = '=';
}
$query = "SELECT * FROM news WHERE id ".$operation.' '.$id. 'ORDER BY id '.$dest.' LIMIT 1';
$row = mysql_fetch_assoc (mysql_query ($query)); 
$id = $row['id'];
 

Фанат

oncle terrible
Команда форума
ForJest
Ну, перешел ты в следующую, а там что передавать?
и почему вы все так уверены, что кроме id ни по какому полю сортировка не происходит?
 

ForJest

- свежая кровь
Автор оригинала: Фанат
ForJest
Ну, перешел ты в следующую, а там что передавать?
и почему вы все так уверены, что кроме id ни по какому полю сортировка не происходит?
Как это что id текущей записи? Ты последнюю строчку поглядел?
Потому что это решение для этой конктреной задачи.
 

Фанат

oncle terrible
Команда форума
а, понял.
Ну, не знаю.
Нарушается стройность приложения.
Ну что это за ссылки вида "айди номер адын и еще отмотай восемь штук влево"?
Элегантное оно с точки зрения кода, но некрасивое с точки зрения интерфейса.
И опять же - привязано к айди.
А лично у меня новости сортируются не по айди, конечно же, а по дате.
 

ForJest

- свежая кровь
Фанат
Ну так вроде разницы никакой, по чём сортировать - хошь по id, хошь по дате.
А почему нарушается? Так можно отматывать именно восемь страниц и через универсальную операцию реализовывать как разбивку на страницы, так и проход по одной новости.
Но я не настаиваю - просто пришла в голову идея.
 

iliah

Новичок
-faqer-
посмотри как это сделано в ЖЖ - интересный вариант
 

Oscar

Новичок
Предидущая запись:
"SELECT * FROM news WHERE id <$id ORDER BY id DESC LIMIT 1"

Текущая и следующая:
"SELECT * FROM news WHERE id =$id OR id >$id ORDER BY id ASC LIMIT 2"

Из предидущей и последующей получаем ID и делаем ссылки, текущую выводим полностью.
Или сортировка новостей идёт не по id?
Тогда тоже самое по полю сортировки.

Или я чего-то не понимаю.
 

Profic

just Profic (PHP5 BetaTeam)
только
"SELECT * FROM news WHERE id =$id OR id >$id ORDER BY id ASC LIMIT 2"
лучше заменить на
"SELECT * FROM news WHERE id >= $id ORDER BY id ASC LIMIT 2"

Красивше :) И будет использоваться индекс (если есть :))
 
Сверху