Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как перенумеровать записи по порядку?
 
 автор: tAleks   (30.08.2006 в 23:16)   письмо автору
 
 

В таблице есть энное количество записей. В поле 'pos' храниться циферка - позиция этой записи.

Т.е. есть, к примеру, 5 записей с позициями: 1, 2, 4, 8, 9.

Можно ли одним запросом перенумеровать их по порядку, т.е. чтобы было 1, 2, 3, 4, 5 ?

Если одним запросом НЕ можно, тогда как это сделать наиболее эфективно?

   
 
 автор: cheops   (31.08.2006 в 12:35)   письмо автору
 
   для: tAleks   (30.08.2006 в 23:16)
 

А зачем их перенумеровывать без разрывов? Ведь поле pos выполняет свою функцию и с разрывами - указывает порядок нумерации.

   
 
 автор: tAleks   (31.08.2006 в 16:13)   письмо автору
 
   для: cheops   (31.08.2006 в 12:35)
 

Ну надо мне это сделать, потому что в некоторых разделах, есть так: 1, 2, 2, 3, 3, 3, 5, 5, 6.

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

   
 
 автор: Владимир22   (31.08.2006 в 16:29)   письмо автору
 
   для: tAleks   (31.08.2006 в 16:13)
 

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

   
 
 автор: Trianon   (31.08.2006 в 16:56)   письмо автору
 
   для: Владимир22   (31.08.2006 в 16:29)
 

Дыра не мешает.
Мешают возникающие в результате неправильной логики работы с БД дубликаты.
Перенумеровывать как правило придется руками.
Можно и внешним скриптом, конечно, только все равно, одним запросом тут не обойтись.
минимум по запросу на каждую кривую запись придется .

Я допускаю, что можно поиграть JOIN c параметрами ORDER BY и LIMIT но эффективность такой игры может вообще положить сервер. Так что лучше руками.

Ну а в Вашем случае - UPDATE ...SET pos=pos-1 WHERE pos > $n после каждого удаления, да только по-моему ничего хорошего это не даст.

   
 
 автор: tAleks   (31.08.2006 в 17:18)   письмо автору
 
   для: Trianon   (31.08.2006 в 16:56)
 

Как быть в этой ситуации? Как тогда все это дело правильно организовать?

   
 
 автор: Trianon   (31.08.2006 в 18:02)   письмо автору
 
   для: tAleks   (31.08.2006 в 17:18)
 

А как назначение значений pos организовано сейчас?

   
 
 автор: tAleks   (31.08.2006 в 18:11)   письмо автору
 
   для: Trianon   (31.08.2006 в 18:02)
 

Сейчас pos назначается так:

SELECT (MAX(pos) + 1) FROM ... WHERE id_group = ....

   
 
 автор: Trianon   (01.09.2006 в 14:04)   письмо автору
 
   для: tAleks   (31.08.2006 в 18:11)
 

тогда каким образом получились одинаковые pos?

Перед тем, как лечить базу, имеет смысл вылечить логику.
А то эти pos опять наплодятся.

   
 
 автор: tAleks   (01.09.2006 в 17:35)   письмо автору
 
   для: Trianon   (01.09.2006 в 14:04)
 

Одинаковые pos получились в результате, экспериментов... сейчас логика работает нормально...
но то что закасячено, надо исправить....

   
 
 автор: Trianon   (01.09.2006 в 17:55)   письмо автору
 
   для: tAleks   (01.09.2006 в 17:35)
 

так а что мешает поправить эти поля в том же phpMyAdmin?

   
 
 автор: tAleks   (01.09.2006 в 18:28)   письмо автору
 
   для: Trianon   (01.09.2006 в 17:55)
 

много их... и лень...

   
 
 автор: cheops   (01.09.2006 в 08:50)   письмо автору
 
   для: tAleks   (31.08.2006 в 16:13)
 

А на это поле никто не ссылается? Т.е. если его отредактировать - связи не порушатся?

   
 
 автор: tAleks   (01.09.2006 в 17:36)   письмо автору
 
   для: cheops   (01.09.2006 в 08:50)
 

В смысле? Как отредактировать?

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

   
 
 автор: cheops   (01.09.2006 в 22:15)   письмо автору
 
   для: tAleks   (01.09.2006 в 17:36)
 

В таблице имеется поле, снабжённое атрибутом AUTO_INCREMENT? Если нет, можно сделать такой финт ушами: отсортировать таблицу физически по полю pos
ALTER TABLE tbl ORDER BY pos

Затем уничтожить столбец pos и создать по новой, но с атрибутом AUTO_INCREMENT и уникальным ключом по полю - значения столбца автоматически пронумеруются от 1 до N (причём в нужном порядке, так как таблица будет отсортирована физически), затем снять атрибут AUTO_INCREMENT и ключ с поля.

   
 
 автор: Владимир22   (01.09.2006 в 22:18)   письмо автору
 
   для: cheops   (01.09.2006 в 22:15)
 

Это ручная работа будет небольшой головной болью, если часто надо будет перенумеровывать.
Жаль, что нет способа решать эту проблему автоматически (скриптами)...

   
 
 автор: cheops   (01.09.2006 в 22:22)   письмо автору
 
   для: Владимир22   (01.09.2006 в 22:18)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования