Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > поменять позицию


Автор: bazzjr 4.6.2010, 19:39
Всем привет.

Имею следующий вопрос:

Есть к примеру таблица новостей  в MYSQL 

id                    text   
1                  sometext
2                  sometext
3                  sometext
...
150              sometext

на страницу выводятся новости по id, т.е.  1 это будет первая новость, 2 будет вторая и т.д.

Как лучше организовать запросы так, чтобы я мог менять позиции новостей?

Т.Е. например я хочу чтобы 143 новость переместилась на 4 позицию, а 4 значит должна стать 5-ой...
Не устраивает подход с пере индексацией всей таблицы, т.е. будет например 10000 записей и чтож их все нужно будет поднимать или опускать каждый раз???

Какие тут есть варианты?

Автор: bars80080 4.6.2010, 19:48
ввести поле order, которое и будет определять нужный тебе порядок. при вставке новости, в поле записывать максимальный порядковый номер + 1. при изменении, то получится два запроса:

Код

UPDATE `table` SET `order`=20 WHERE `id`=140
и
UPDATE `table` SET `order`=`order`+1 WHERE `order`>19 AND `order`<140

Автор: bazzjr 4.6.2010, 19:58
т.е. переопределять все остальные данные в поле order в любом случае придется?

А если  у нас записей в таблице 1 000 000, что тогда, тоже начиная с4 и кончая 999 999  переопределять?

Автор: ksnk 4.6.2010, 20:24
Если покопаться в долговременной памяти и вспомнить самый первый бейсик, можно вспомнить, что там строчки нумеровались. Причем нумерация строк имела приземленный практический смысл. В операторе goto нужно было указывать номер строки. Так вот, чтобы не городить перенумерацию строк в программе по каждому дурацкому изменению, строки получали автоматические номера, кратные 10. Тоесть незадачливый программер имел возможность вставить еще 9 строк, без необходимости перенумеровывать все строки ;) 
Дарю идею.

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

Автор: bazzjr 4.6.2010, 20:31
Да эта мысль посетила меня одной из первых, но она тоже не идеальна.

При "ленивом" коде и не сложной выборки, мы сможем поменять одну новость местами 8-10 раз, но конечно при хорошой выборке(выбрать меньшее,выбрать большее после и перед нужным числом), то тогда имея в распоряжении пару доп цифр можно менять практически до бесконечности. 
Но все таки может есть другие варианты, поэтому и спрашиваю smile

Автор: bars80080 5.6.2010, 01:03
а почему не миллиард?

особенность реального мира состоит в том, что наши задачи исключительно практические.

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

а по реальным задачам подбираются реальные решения. подобная система ордеровки хорошо вписывается, к примеру, в моей структуре страниц сайта. изменение позиции происходит настолько редко, что даже не стоит говорить.
с другой стороны, никогда не слышал, чтобы изменяли порядок новостей. обычно он определяется всего двумя показателями:
1. дата создания
2. популярность
поэтому, прежде чем размышлять о миллионах, я бы посоветовал обдумать задачу внимательнее. а если спрашиваешь, рассказывать именно реальные условия, а не сказки

Автор: NewDima 5.6.2010, 05:46
bazzjr, может если задачу поставить как "поменять две записи местами", ничего страшного не произойдет?
А если по самой проблеме, то с учетом того, что сказал ksnk, можно записи вставлять с разницей в весе 4294, если максимальное количество записей будет 10^6. Думаю и число 10^6 вас удовлетворит с лихвой и 4293 смены позиций без перерасчета всей таблицы. Хотя задача действительно высосона из пальца.

Автор: bazzjr 5.6.2010, 09:10
NewDima, 
Цитата(NewDima @  5.6.2010,  05:46 Найти цитируемый пост)
может если задачу поставить как "поменять две записи местами"


дык это совсем другая ситуация, мой вопрос с другом.


bars80080, 
Ты прав в некотором роде, но ведь если тебе нужно попасть из Владивостока в Москву, ты же не пойдешь пешком в Москву, а скорей всего полетишь на самолёте.  smile 

Сейчас я работаю над реализацией "относительными ссылками", о результатах дам знать. Если не покатит значит реализую как говорит уважаемый bars80080.

Автор: bars80080 5.6.2010, 12:34
Цитата(bazzjr @  5.6.2010,  09:10 Найти цитируемый пост)
Сейчас я работаю над реализацией "относительными ссылками"

ну, вот видишь. оказывается, это уже и не новости. а у этого дела может быть своя специфика (хотя тут я уже не подскажу)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)