| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > изменение порядка сортировки |
| Автор: z-END 15.9.2005, 22:05 |
| есть таблица (MySQL+PHP) данные из которой выводятся по порядковому номеру (автоинкриментное поле - id) т.е. чем новее запись (по id) тем выше она отображается в списке. и тут возникает необходимость запись под номером N поместить наверх, где она будет первой до добавления новой записи или "поднятия" другой записи из уже имеющихся... первая мысль которая мне пришла просто определять максимальное значение id в таблице и присваивать его нужной записи, но оказалось что id менять нельзя по условию, и вот я в прострации, что делать? |
| Автор: LSD 15.9.2005, 22:12 | ||
| А запись только одну надо "поднять" или их может быть много? Добавлено @ 22:13 Если MySQL поддерживает Union, то можно так:
|
| Автор: z-END 15.9.2005, 22:26 | ||||
нет, "поднимать" записи надо разные, вот например таблица:
данные выводятся в обратном порядке т.е. на выходе получим: brother,sister, papa,mama. теперь нам надо "поднять" маму, т.е. чтобы на выходе получить: mama,brother,sister, papa. после этого например добавили grandmother (id=5) и она выводится первой т.е. : grandmother,mama,brother,sister, papa. а потом "подняли" брата и получили: brother,grandmother,mama,sister, papa. вот, надеюсь так понятней будет... я думаю нужно вести дополнительное сортировочное поле, только вот как им пользоваться... х.з. |
| Автор: LSD 15.9.2005, 22:30 |
| Заведи еще одно поле, такого же типа что и id и при вставке записи прописывай туда то же значение что и в id. А дальше как ты сказал при необходимости "поднять" поле берем новый id из последовательности (заметь не максимум а из последовательности) и прописываем его туда. |
| Автор: z-END 15.9.2005, 22:37 | ||||
я в id значения непрописываю, они задаются мускулом (autoinc) и я чесно говоря незнаю как определить в момент добавления значение id... зы может Max(id)+1 просто делать и все?
а это как? Max(id)+1 неподходит? |
| Автор: LSD 15.9.2005, 22:46 | ||
Тогда надо при перед каждой вставкой выполнять select max(sort_id) + 1 from table, а это не есть гут, с точки зрения производительности. А насчет последовательностей надо подождать специалистов по MySQL. |
| Автор: igon 16.9.2005, 00:54 | ||
При условии добавления рекомендованного LSD поля (которому тоже хорошо бы быть autoinc)
PS: В MySQL не специалист |
| Автор: Akina 16.9.2005, 08:16 |
| Ключевое поле (автоинкрементный ID, unique) используется ТОЛЬКО для органеизации связей и поддержания целостности БД. Если нужна сортировка - заводи для этого еще одно поле. |
| Автор: bas 16.9.2005, 09:36 |
| Еще одно поле , только так. Где номер будет соответствовать позиции, этот способ используется для построения TreeViews Добавлено @ 09:37 Или новую таблицу, чтобы не изменять существующую. |
| Автор: igon 16.9.2005, 16:34 |
| По некотором размышлении (во сне? В дополнительное поле заноси текущее системное время, вплоть до долей ms. У "поднимаемого" update этого поля тоже текущим системным временем. При выборке - обратная хронологическая сортировка |
| Автор: z-END 16.9.2005, 19:26 | ||
а если на серваке хостеры время взад-вперед (зима/лето) двигать будут? |
| Автор: LSD 16.9.2005, 22:02 |
| А sequence в MySQL есть? |
| Автор: z-END 17.9.2005, 10:18 | ||
чесно говоря незнаю |
| Автор: igon 17.9.2005, 14:36 | ||
С sequence, конечно, идеально было бы. |
| Автор: z-END 17.9.2005, 15:34 | ||
ну впринципе да LSD, igon пасибо! |
| Автор: LSD 17.9.2005, 17:54 | ||
Я глянул доки по MySQL, sequence-ов там нет. Их можно конечно эмулировать (тем более что есть таблицы не подверженные транзакциям), но это сложнее чем со временем. Я думаю, если использовать GMT плюс синхронизация со временем в интернете, то особых проблем быть не должно. |