Есть Таблица в БД с новостями, имеется поле curPos (current position), по которому и производится вывод новостей на страницу.
Задача состоит в том, чтобы при добавлении, удалении, и редактировании новостей корректно влиять на это поле.
Добавление новостей:
$tableCount = get_count_table("news"); //получение кол-ва записей в `news`
$needPos = $_POST['needPos']; //получение требуемой позиции из формы добавления новостей
mysql_query("INSERT INTO news SET ..., curPos = '$needPos'"); //добавляем новость
for($i=1; $i<=$tableCount; $i++) { // проходим по всем новостям в БД
$curPos = get_pos($i); //получаем $curPos для текущего $i (равно id новости в БД)
if($curPos >= $needPos) { //если текущая позиция больше или равна требуемой
$curPos++; //то увеличиваем текущую позицию
mysql_query("UPDATE news SET curPos = '$curPos' WHERE id = '$i'"); //и записываем в БД
}
}
Редактирование новостей
$needPos = $_POST['needPos']; //получаем требуемую позицию
$pastId = get_id($needPos); //получаем ID той новости, которая стоит на требуемой позиции
$pastPos = get_pos($nid); //получаем curPos новости, которую редактируем
mysql_query("UPDATE news SET curPos = '$needPos' WHERE id = '$nid'"); //меняем позицию редактируемой новости
mysql_query("UPDATE news SET curPos = '$pastPos' WHERE id = '$pastId'"); //меняем позицию новости, стоящей на требуемой позиции
Удаление новостей
$tableCount = get_count_table("news"); //получение кол-ва записей в `news`
$needPos = get_pos($nid); //получение позиции удаляемой новости
for($i=1; $i<=$tableCount; $i++) { //проходим по всем новостям
$curPos = get_pos($i); //получаем позицию каждой
if($curPos >= $needPos) { //если позиция больше или равна позиции удаляемой новости
$curPos--; //то уменьшаем текущую позицию
mysql_query("UPDATE news SET curPos = '$curPos' WHERE id = '$i'"); //и записываем в БД
}
}
Стоит также заметить, что поле curPos не должно иметь одинаковых элементов, что, собственно, не получается осуществить.
Пожалуйста, оцените мой подход. Что тут не так? Или есть более рациональные пути?
Спасибо.

Спустя 4 часа, 22 минуты, 30 секунд (9.08.2010 - 20:20) linker написал(а):
Вот это вот никогда не добавит новость
mysql_query("INSERT INTO news SET ..., curPos = '$needPos'")И вот это, оригинальное удаление
mysql_query("UPDATE news SET curPos = '$curPos' WHERE id = '$i'");А вообще, какая-то ерунда.
Спустя 47 минут, 41 секунда (9.08.2010 - 21:08) CyberOrcX написал(а):
многоточие означает то, что там кроме этого еще и в другие поля добавлять нужно
Спустя 29 минут, 34 секунды (9.08.2010 - 21:37) linker написал(а):
CyberOrcX
Вы думаете дело в многоточиях? Тогда советую покурить мануал по SQL. Моя ошибка. Но курить мануал таки надо на предмет auto increment полей.
Спустя 22 минуты, 40 секунд (9.08.2010 - 22:00) CyberOrcX написал(а):
естественно, запрос же должен быть таким
INSERT INTO table_name (id, name, text)
VALUES('$id', '$name', '$text')
Спустя 2 минуты, 28 секунд (9.08.2010 - 22:02) linker написал(а):
Не понятно, зачем нужно поле curPos.
Спустя 1 час, 46 минут, 22 секунды (9.08.2010 - 23:49) UES.CoB_frv написал(а):
linker, многоточие было поставлено для сокращения, чтобы не писать ненужные поля. Хорошо, привожу полный пример:
Здесь нас интересует только поле curPos, оно нужно для того, чтобы по нему выводить новости, осуществлять сортировку (ORDER BY curPos ASC). Данное поле я ввел для того, чтобы не изменять поле id (id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY).
mysql_query("INSERT INTO news SET
title = '" . mysql_real_escape_string($_POST['title']) . "',
theme = '" . mysql_real_escape_string($_POST['theme']) . "',
fullDesc = '" . mysql_real_escape_string($_POST['fullDesc']) . "',
shortDesc = '" . mysql_real_escape_string($_POST['shortDesc']) . "',
e_comments = '" . $_POST['e_comments'] . "',
aid = '" . $_POST['aid'] . "',
addTmstmp = NOW(),
curPos = '" . $_POST['needPos'] . "'
");
Здесь нас интересует только поле curPos, оно нужно для того, чтобы по нему выводить новости, осуществлять сортировку (ORDER BY curPos ASC). Данное поле я ввел для того, чтобы не изменять поле id (id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY).
Спустя 7 часов, 52 минуты, 6 секунд (10.08.2010 - 07:41) linker написал(а):
UES.CoB_frv
Да не, я уже увидел, что проморгал малясь, моя ошибка.
Я вот только не пойму, а зачем его изменять? Я никак не пойму смысл curPos, когда есть замечательный id. Зачем вы себе лишний гемморой придумали? А нельзя выводить новости по id, сортировать по id или addTmstmp, удалять по id, редактировать по id?
Да не, я уже увидел, что проморгал малясь, моя ошибка.
Я вот только не пойму, а зачем его изменять? Я никак не пойму смысл curPos, когда есть замечательный id. Зачем вы себе лишний гемморой придумали? А нельзя выводить новости по id, сортировать по id или addTmstmp, удалять по id, редактировать по id?
Спустя 2 часа, 14 минут, 21 секунда (10.08.2010 - 09:55) UES.CoB_frv написал(а):
linker, дело в том, что к ID новости у меня привязаны комментарии, поэтому изменять ID просто недопустимо.
Спустя 36 минут, 27 секунд (10.08.2010 - 10:32) sergeiss написал(а):
Цитата (UES.CoB_frv @ 10.08.2010 - 10:55) |
поэтому изменять ID просто недопустимо. |
А linker и не предлагает ID менять! "удалять по id, редактировать по id" и другие подобные высказывания подразумевают, что обращение будет с учетом id. И что-то будет изменяться, но id при этом будет оставаться неизменным (кроме случая удаления).
Спустя 28 минут, 40 секунд (10.08.2010 - 11:00) linker написал(а):
sergeiss
Именно
Я просто пытаюсь понять, зачем еще что-то кроме id.
Именно
Я просто пытаюсь понять, зачем еще что-то кроме id.
Спустя 2 часа, 34 минуты, 33 секунды (10.08.2010 - 13:35) UES.CoB_frv написал(а):
Цитата |
(кроме случая удаления) |
именно, нужно все предусмореть. Я разобрался с этой задачей уже, все работает... Проблема только в нерациональности (каждый раз при добавлении, редактировании, удалении новостей проходить по всей базе - перегружать сервер). Цель этого всего - дать возможность модератору (или кому то другому, у кого буду права) изменять положение новости на странице. Конечно, можно просто изменять дату написания, и выводить по ней, но меня заинтересовала идея отдельной переменной, и вот, осуществив это, стало нерациональным
Можно ли как нибудь, этим способом, снизить нагрузку?

Спустя 3 минуты, 50 секунд (10.08.2010 - 13:39) sergeiss написал(а):
UES.CoB_frv - как хорошо видно, ты любитель создавать себе трудности, а потом их мужественно преодолевать 
Но я так и не понял, чем тебе не нравится сортировка по дате редактирования?

Но я так и не понял, чем тебе не нравится сортировка по дате редактирования?
Спустя 15 минут, 52 секунды (10.08.2010 - 13:54) UES.CoB_frv написал(а):
sergeiss, я сделал такую вещь при добавлении новостей: выбор позиции и селектом пункты. Достаточно удобно и понятно. Разве это не прекрасно? А редачить датой нужно высчитывать и тд. Это мое Имхо.

Спустя 2 минуты, 13 секунд (10.08.2010 - 13:57) linker написал(а):
Это не прекрасно, это охриненная нагрузка на сервант. С датой ничего высчитывать не надо. Наш тебе совет, правильно, рационально и прекрасно будет именно без curPos.
Спустя 8 минут, 49 секунд (10.08.2010 - 14:06) UES.CoB_frv написал(а):
linker, понял. Если нагрузка действительно огромная... тогда да, надо переделать. Значит вариант с датой лучше использовать? Вывод по дате, а для передислокации новостей - редачить дату?
Спустя 1 минута, 28 секунд (10.08.2010 - 14:07) sergeiss написал(а):
Цитата (UES.CoB_frv @ 10.08.2010 - 14:35) |
Цель этого всего - дать возможность модератору (или кому то другому, у кого буду права) изменять положение новости на странице. Конечно, можно просто изменять дату написания, и выводить по ней, но меня заинтересовала идея отдельной переменной, и вот, осуществив это, стало нерациональным |
Во-первых, надо однозначно индексировать правильно. Потому что правильный индекс очень сильно уменьшает время выполнения запроса.
Во-вторых, надо все-таки поменять что-то. Например, не позицию указывать, а некую "очередь".
Пример 1 - хранить у новости id новости, которая должна идти за ней.
Пример 2 - хранить id новости, которая предыдущая в очереди.
Пример 3 - хранить у данной новости 2 дополнительных id: предыдущей и следующей новости.
А дальше осталось только изменять данные в отдельных строках (в 1 или в 3-х). Нефиг "шерстить" всю таблицу.
PS. Примеры эти - это как ты в живой очереди занимаешь место. Ты знаешь только кто перед тобой и кто за тобой. И пофиг, кто где остальные. Для тебя важно только выбывание из очереди того, кто прямо перед тобой и (менее значимо) того, кто за тобой.
Спустя 16 минут (10.08.2010 - 14:23) UES.CoB_frv написал(а):
sergeiss, ха, очень гуд идея! Осталось ее только реализовать. Обязательно надо ее реализовать! Спасибо, +1. Буду думать, если не справлюсь, тогда обращусь за помощью.
Спустя 14 минут, 15 секунд (10.08.2010 - 14:37) sergeiss написал(а):
Цитата (UES.CoB_frv @ 10.08.2010 - 15:23) |
тогда обращусь за помощью. |
Ю а вэлкам
