Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > изменение порядка сортировки


Автор: z-END 15.9.2005, 22:05
есть таблица (MySQL+PHP) данные из которой выводятся по порядковому номеру (автоинкриментное поле - id) т.е. чем новее запись (по id) тем выше она отображается в списке.
и тут возникает необходимость запись под номером N поместить наверх, где она будет первой до добавления новой записи или "поднятия" другой записи из уже имеющихся... первая мысль которая мне пришла просто определять максимальное значение id в таблице и присваивать его нужной записи, но оказалось что id менять нельзя по условию, и вот я в прострации, что делать?

Автор: LSD 15.9.2005, 22:12
А запись только одну надо "поднять" или их может быть много?
Добавлено @ 22:13
Если MySQL поддерживает Union, то можно так:
Код
select * from tabl where id = N
union
select * from tabl where id <> N order by id desc

Автор: z-END 15.9.2005, 22:26
Цитата(LSD @ 15.9.2005, 23:12)
А запись только одну надо "поднять" или их может быть много?

нет, "поднимать" записи надо разные, вот например таблица:
Цитата
id | name
1  | mama
2  | papa
3  | sister
4  | brother

данные выводятся в обратном порядке т.е. на выходе получим:
brother,sister, papa,mama.
теперь нам надо "поднять" маму, т.е. чтобы на выходе получить:
mama,brother,sister, papa.
после этого например добавили grandmother (id=5) и она выводится первой т.е. :
grandmother,mama,brother,sister, papa.
а потом "подняли" брата и получили:
brother,grandmother,mama,sister, papa.
вот, надеюсь так понятней будет...
я думаю нужно вести дополнительное сортировочное поле, только вот как им пользоваться... х.з. smile

Автор: LSD 15.9.2005, 22:30
Заведи еще одно поле, такого же типа что и id и при вставке записи прописывай туда то же значение что и в id. А дальше как ты сказал при необходимости "поднять" поле берем новый id из последовательности (заметь не максимум а из последовательности) и прописываем его туда.

Автор: z-END 15.9.2005, 22:37
Цитата(LSD @ 15.9.2005, 23:30)
такого же типа что и id и при вставке записи прописывай туда то же значение что и в id

я в id значения непрописываю, они задаются мускулом (autoinc) и я чесно говоря незнаю как определить в момент добавления значение id...
зы может Max(id)+1 просто делать и все?

Цитата(LSD @ 15.9.2005, 23:30)
поле берем новый id из последовательности (заметь не максимум а из последовательности) и прописываем его туда.

а это как? Max(id)+1 неподходит?

Автор: LSD 15.9.2005, 22:46
Цитата(z @ 15.9.2005, 23:37)
зы может Max(id)+1 просто делать и все?

Тогда надо при перед каждой вставкой выполнять select max(sort_id) + 1 from table, а это не есть гут, с точки зрения производительности.

А насчет последовательностей надо подождать специалистов по MySQL.

Автор: igon 16.9.2005, 00:54
При условии добавления рекомендованного LSD поля (которому тоже хорошо бы быть autoinc)
Код

1. select lsd_id 
       into do_up
       from myTable 
       where name='mama'
2. select max(lsd_id) 
       into max_lsd_id
       from myTable
3. update myTable
      set lsd_id = lsd_id-1
      where lsd_id>do_up
4. update myTable
      set lsd_id = max_lsd_id
      where name='mama'
Можно сократить и до двух Update
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
По некотором размышлении (во сне? smile):
В дополнительное поле заноси текущее системное время, вплоть до долей ms. У "поднимаемого" update этого поля тоже текущим системным временем. При выборке - обратная хронологическая сортировка

Автор: z-END 16.9.2005, 19:26
Цитата(igon @ 16.9.2005, 17:34)
дополнительное поле заноси текущее системное время, вплоть до долей ms. У "поднимаемого" update этого поля тоже текущим системным временем. При выборке - обратная хронологическая сортировка

а если на серваке хостеры время взад-вперед (зима/лето) двигать будут?

Автор: LSD 16.9.2005, 22:02
А sequence в MySQL есть?

Автор: z-END 17.9.2005, 10:18
Цитата(LSD @ 16.9.2005, 23:02)
А sequence в MySQL есть?

чесно говоря незнаюsmile

Автор: igon 17.9.2005, 14:36
Цитата
а если на серваке хостеры время взад-вперед (зима/лето) двигать будут?
Да это вроде не проблема: ну, сдвинут в воскресенье в 3.00 ночи на час назад (если вперед - вообще не страшно) - через час, тем более к утру понедельника этот сдвиг уже "компенсируется".

С sequence, конечно, идеально было бы.

Автор: z-END 17.9.2005, 15:34
Цитата(igon @ 17.9.2005, 15:36)
Да это вроде не проблема

ну впринципе даsmile так наверно и поступлюsmile
LSD, igon пасибо!


Автор: LSD 17.9.2005, 17:54
Цитата(igon @ 17.9.2005, 15:36)
С sequence, конечно, идеально было бы.

Я глянул доки по MySQL, sequence-ов там нет. Их можно конечно эмулировать (тем более что есть таблицы не подверженные транзакциям), но это сложнее чем со временем.

Я думаю, если использовать GMT плюс синхронизация со временем в интернете, то особых проблем быть не должно.

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