|
|
|
| В таблице есть энное количество записей. В поле 'pos' храниться циферка - позиция этой записи.
Т.е. есть, к примеру, 5 записей с позициями: 1, 2, 4, 8, 9.
Можно ли одним запросом перенумеровать их по порядку, т.е. чтобы было 1, 2, 3, 4, 5 ?
Если одним запросом НЕ можно, тогда как это сделать наиболее эфективно? | |
|
|
|
|
|
|
|
для: tAleks
(30.08.2006 в 23:16)
| | А зачем их перенумеровывать без разрывов? Ведь поле pos выполняет свою функцию и с разрывами - указывает порядок нумерации. | |
|
|
|
|
|
|
|
для: cheops
(31.08.2006 в 12:35)
| | Ну надо мне это сделать, потому что в некоторых разделах, есть так: 1, 2, 2, 3, 3, 3, 5, 5, 6.
А чтобы в административной части менять позиции, одинаковых номеров позиций быть не должно...
вот мне и надо их перенумеровть по порядку...
А как поменять местами две позиции с номером позиции 5? | |
|
|
|
|
|
|
|
для: tAleks
(31.08.2006 в 16:13)
| | Кстати, очень актуальная тема... Иногда запись из средины удаляется, а нумерация новых продолжается дальше, в итоге в последовательности образуется дыра. Действительно, можно ли как-то правильно перенумеровать таблицу в таком случае? | |
|
|
|
|
|
|
|
для: Владимир22
(31.08.2006 в 16:29)
| | Дыра не мешает.
Мешают возникающие в результате неправильной логики работы с БД дубликаты.
Перенумеровывать как правило придется руками.
Можно и внешним скриптом, конечно, только все равно, одним запросом тут не обойтись.
минимум по запросу на каждую кривую запись придется .
Я допускаю, что можно поиграть JOIN c параметрами ORDER BY и LIMIT но эффективность такой игры может вообще положить сервер. Так что лучше руками.
Ну а в Вашем случае - UPDATE ...SET pos=pos-1 WHERE pos > $n после каждого удаления, да только по-моему ничего хорошего это не даст. | |
|
|
|
|
|
|
|
для: Trianon
(31.08.2006 в 16:56)
| | Как быть в этой ситуации? Как тогда все это дело правильно организовать? | |
|
|
|
|
|
|
|
для: tAleks
(31.08.2006 в 17:18)
| | А как назначение значений pos организовано сейчас? | |
|
|
|
|
|
|
|
для: Trianon
(31.08.2006 в 18:02)
| | Сейчас pos назначается так:
SELECT (MAX(pos) + 1) FROM ... WHERE id_group = ....
|
| |
|
|
|
|
|
|
|
для: tAleks
(31.08.2006 в 18:11)
| | тогда каким образом получились одинаковые pos?
Перед тем, как лечить базу, имеет смысл вылечить логику.
А то эти pos опять наплодятся. | |
|
|
|
|
|
|
|
для: Trianon
(01.09.2006 в 14:04)
| | Одинаковые pos получились в результате, экспериментов... сейчас логика работает нормально...
но то что закасячено, надо исправить.... | |
|
|
|
|
|
|
|
для: tAleks
(01.09.2006 в 17:35)
| | так а что мешает поправить эти поля в том же phpMyAdmin? | |
|
|
|
|
|
|
|
для: Trianon
(01.09.2006 в 17:55)
| | много их... и лень... | |
|
|
|
|
|
|
|
для: tAleks
(31.08.2006 в 16:13)
| | А на это поле никто не ссылается? Т.е. если его отредактировать - связи не порушатся? | |
|
|
|
|
|
|
|
для: cheops
(01.09.2006 в 08:50)
| | В смысле? Как отредактировать?
Это поле сделано исключительно для сортировки записей по порядку, и для того чтобы двигать записи ввех и вниз .... | |
|
|
|
|
|
|
|
для: tAleks
(01.09.2006 в 17:36)
| | В таблице имеется поле, снабжённое атрибутом AUTO_INCREMENT? Если нет, можно сделать такой финт ушами: отсортировать таблицу физически по полю pos
ALTER TABLE tbl ORDER BY pos
|
Затем уничтожить столбец pos и создать по новой, но с атрибутом AUTO_INCREMENT и уникальным ключом по полю - значения столбца автоматически пронумеруются от 1 до N (причём в нужном порядке, так как таблица будет отсортирована физически), затем снять атрибут AUTO_INCREMENT и ключ с поля. | |
|
|
|
|
|
|
|
для: cheops
(01.09.2006 в 22:15)
| | Это ручная работа будет небольшой головной болью, если часто надо будет перенумеровывать.
Жаль, что нет способа решать эту проблему автоматически (скриптами)... | |
|
|
|
|
|
|
|
для: Владимир22
(01.09.2006 в 22:18)
| | Если вам нужны записи без повторов, следует так организовать скрипт, чтобы он их не делал - тогда эту операцию не придётся совершать. Она поэтому такая сложная, что её не часто приходиться выполнять. | |
|
|
|