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

Форум MySQL

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

 

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

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

тема: Сортировка строк в таблике
 
 автор: Zilog   (08.02.2007 в 23:11)   письмо автору
 
 

Уважаемые!

Подскажите, пожалуйста, как можно организовать произвольную сортировку строк в таблице.
Другими словми, хочу дать пользователю возможность самостоятельно определять порядкок строк - пусть передвигает строку вверх/вниз, на нужную ему позицию.

Подскажите, пж, как лучше сделать это?

   
 
 автор: Trianon   (09.02.2007 в 01:06)   письмо автору
 
   для: Zilog   (08.02.2007 в 23:11)
 

Речь идет о данных в таблице MySQL или об HTML-таблице?

   
 
 автор: Zilog   (09.02.2007 в 01:31)   письмо автору
 
   для: Trianon   (09.02.2007 в 01:06)
 

MYSQL

   
 
 автор: ZuArt   (09.02.2007 в 09:27)   письмо автору
 
   для: Zilog   (09.02.2007 в 01:31)
 

никак, кроме создания доп.поле индекса в таблице и выдавать сортировку по этому полю...
стрелка вверх - поменять местами значения соседних полей.... По другому гарантировано никак не сделать, но такая сортировка будет распространяться на всех пользователей...
если же надо каждому индивидуально, то доп. таблица из 3-х полей..
User_Id, Record_Id, Index_Sort - соответственно запросы выстраивать с объединением двух таблиц, по выборке индексов для конкретного пользователя и менять местами соседние индексы уже в доп. таблице.

   
 
 автор: Zilog   (09.02.2007 в 10:16)   письмо автору
 
   для: ZuArt   (09.02.2007 в 09:27)
 

Это всё понятно. Непонятно как именно передвигать. Механизм какой?
Поле индекса autoincement должно быть? Например:
Допустим есть порядок 1,2,3,4,5. 3 удалили. Добавили 6.
Что бы переместить 6 на место бывш.3 - при нажатии "вверх", нам надо сперва поменять местами 5 и 6. Но как лучше это сделать? как правильно?

   
 
 автор: Trianon   (09.02.2007 в 16:45)   письмо автору
 
   для: Zilog   (09.02.2007 в 10:16)
 

Не трогайте autoincrement . Это обычно первичный ключ. Он не имеет никакого отношения к порядку строк.

   
 
 автор: Zilog   (09.02.2007 в 18:59)   письмо автору
 
   для: Trianon   (09.02.2007 в 16:45)
 

>Не трогайте autoincrement . Это обычно первичный ключ. Он не имеет никакого отношения к порядку строк.

так а как быть в случае, если кол-во строк постоянно меняется (add/del)? получается, что после каждого действия, надо пробегать по всему массиву проставляя заново индексы. Так получается?

   
 
 автор: cheops   (09.02.2007 в 19:11)   письмо автору
 
   для: Zilog   (09.02.2007 в 18:59)
 

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

   
 
 автор: Zilog   (10.02.2007 в 00:14)   письмо автору
 
   для: cheops   (09.02.2007 в 19:11)
 

Непонимаю. Вот сейчас у меня, допустим, сто записей, и поле index, которе у всех равно нулю. И чего? Что с того, что я при выводе index проставлю от 1 до 100? - каждый раз при выводе таблицы, порядок будет одинаковым.

   
 
 автор: cheops   (10.02.2007 в 02:46)   письмо автору
 
   для: Zilog   (10.02.2007 в 00:14)
 

В записях что хранится? Какую структуру имеет ваша таблица?

   
 
 автор: Zilog   (13.02.2007 в 00:12)   письмо автору
 
   для: cheops   (10.02.2007 в 02:46)
 

>В записях что хранится? Какую структуру имеет ваша таблица?


например, так:
id,index,caption

задача - создать механизм ручной сортировки по полю индекс.

   
 
 автор: ZuArt   (13.02.2007 в 10:33)   письмо автору
 
   для: Zilog   (13.02.2007 в 00:12)
 

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

в случае передвижение вверх - передается опция направления и ИНДЕКС ($Index) передвигаемой записи
select * from tbl where ind<=$Index limit 0,2

в случае передвижение вниз - передается опция направления и ИНДЕКС ($Index) передвигаемой записи
select * from tbl where ind>=$Index limit 0,2

Если получаем одну строку, то это крайняя строка и значит не может передвигаться в сторону границы =) т.к. уже граничная

Если получим две строки у которых естественно известно ID и IND - делее два запроса для смены МЕСТАМИ значений поля IND
Для первой
update tbl set IND=$Ind2 where id=$Id1
Для второй
update tbl set IND=$Ind1 where id=$Id2

Для передачи данных нужно просто в списке в качестве значения параметра указывать не ID а IND, и направление перемещения

Все!!!

   
 
 автор: Loki   (09.02.2007 в 09:28)   письмо автору
 
   для: Zilog   (09.02.2007 в 01:31)
 

а зачем пользователю сортировать mysql таблицу?

   
 
 автор: Trianon   (09.02.2007 в 09:31)   письмо автору
 
   для: Zilog   (09.02.2007 в 01:31)
 

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

Обработка стрелок вверх/вниз в этом случае сводится к обмену значениями позиций двух соседних строк.

   
Rambler's Top100
вверх

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