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

  • Автор темы Автор темы -faqer-
  • Дата начала Дата начала

-faqer-

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

Есть таблица с новостями
id|title|content
При прочтении каждой новсоти есть сылки на предыдущую и последующую новости по принципу id-1 и id+1.
Все хорошо. Но в том случае, если вдруг какую либо новость удалили, то при подобной ссылке происходит прыжок в пустоту.
Как сделать выборку с лимитом в три строки, чтобы вторая была с данной новостью, а первая и третья действительно предыдущая и последующая новость вне зависимости от их id
Заранее благодарю
 
id - это идентификатор а не порядковый номер, поэтому id-1 так же как id+1 смысла иметь не могут.
 
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 была второй по порядку.
Опять же заранее благодарю.
 
2 Фанат
Каким образом.
Если у предыдущей и последующей новости может быть какой угодно id??
 
ну и что?
единственный способ, по-твоему, запросить запись из базы - это знать ее айди?
 
Фанат
Очень хотелось бы понимать все с полуслова, но не всегда это выходит
Подскажи, я не понимаю
И снова, заранее благодарю.
 
кроме знака равно, какие еще у нас бывают операторы сравнения?

попробуй визуально представить себе ряд записей.
1 5 9 15 20
текущая - 9.
неужели так сложно выбрать записи, следующие за 9?
и ограничить выборку одной строкой?
 
Но в том случае, если вдруг какую либо новость удалили, то при подобной ссылке происходит прыжок в пустоту.
Решение (элегантное) - передаёшь вместе с 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'];
 
ForJest
Ну, перешел ты в следующую, а там что передавать?
и почему вы все так уверены, что кроме id ни по какому полю сортировка не происходит?
 
Автор оригинала: Фанат
ForJest
Ну, перешел ты в следующую, а там что передавать?
и почему вы все так уверены, что кроме id ни по какому полю сортировка не происходит?
Как это что id текущей записи? Ты последнюю строчку поглядел?
Потому что это решение для этой конктреной задачи.
 
а, понял.
Ну, не знаю.
Нарушается стройность приложения.
Ну что это за ссылки вида "айди номер адын и еще отмотай восемь штук влево"?
Элегантное оно с точки зрения кода, но некрасивое с точки зрения интерфейса.
И опять же - привязано к айди.
А лично у меня новости сортируются не по айди, конечно же, а по дате.
 
Фанат
Ну так вроде разницы никакой, по чём сортировать - хошь по id, хошь по дате.
А почему нарушается? Так можно отматывать именно восемь страниц и через универсальную операцию реализовывать как разбивку на страницы, так и проход по одной новости.
Но я не настаиваю - просто пришла в голову идея.
 
-faqer-
посмотри как это сделано в ЖЖ - интересный вариант
 
Предидущая запись:
"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?
Тогда тоже самое по полю сортировки.

Или я чего-то не понимаю.
 
только
"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"

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