Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таблица с порядком вывода записей 
:(
    Опции темы
RomanEEP
Дата 7.5.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Есть таблица, где хранятся строки:
PATHS
--------
ID: Integer
Name: VarChar

Данные:
1      Path1
4      Path67
5      TestData

Как нужно изменить структуру таблицы, чтобы там хранилась инфа в каком порядке выводить записи? К примеру, чтобы юзер смог передвинуть третью строку на первое место, чтобы таблица стала такой:

Данные:
5      TestData
1      Path1
4      Path67

Мне приходит в голову вариант менять между собой все поля 2-х записей при перемещении строк по списку. Правильно ли это?

PM MAIL   Вверх
Роман
Дата 7.5.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 9.7.2006

Репутация: нет
Всего: 1



Достаточна замена только второго поля Name, так как сортировка идет по полю ID


--------------------
Жизнь -  это последствия от последствий.
user posted image
PM ICQ   Вверх
RomanEEP
Дата 7.5.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Как лучше сделать эту замену - на клиенте или через SQL. И если через SQL, то как?
PM MAIL   Вверх
Zloxa
Дата 7.5.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Достаточно добавить поле order и, в случае перемещения записи менять лишь его значения.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
RomanEEP
Дата 7.5.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Цитата(Zloxa @  7.5.2009,  16:05 Найти цитируемый пост)
Достаточно добавить поле order и, в случае перемещения записи менять лишь его значения.

Пусть будет таблица
ID Name Order
6  Path1  1
8  Path2  2
9  Path3  3
на что мне поменять Order, чтобы первую строку поставить на второе место?

PM MAIL   Вверх
Zloxa
Дата 7.5.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(RomanEEP @  7.5.2009,  16:27 Найти цитируемый пост)
на что мне поменять Order, чтобы первую строку поставить на второе место?

на (2+3)/2 ;))

либо поменять значения odrer для id = 6 и id = 8

Это сообщение отредактировал(а) Zloxa - 7.5.2009, 16:44


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
RomanEEP
Дата 7.5.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Цитата(Zloxa @  7.5.2009,  16:42 Найти цитируемый пост)
либо поменять значения odrer для id = 6 и id 

Ага))) а если у меня там 10000 строк а не 2, у всех заменять?

PM MAIL   Вверх
Роман
Дата 7.5.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 9.7.2006

Репутация: нет
Всего: 1



Zloxa, я про id и писал smile

RomanEEP, как сделать через sql - не знаю. Пока вижу только программный путь.

P. S. добавление лишних полей - не лучшая практика.


--------------------
Жизнь -  это последствия от последствий.
user posted image
PM ICQ   Вверх
RomanEEP
Дата 7.5.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Но в любом случае делать придется через SQL, потому что полей может быть много и там здоровые BLOB поля могут затесаться - их нехорошо гонять через клиента
PM MAIL   Вверх
Zloxa
Дата 7.5.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(RomanEEP @  7.5.2009,  16:54 Найти цитируемый пост)
Ага))) а если у меня там 10000 строк а не 2, у всех заменять?

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

Цитата(Роман @  7.5.2009,  16:54 Найти цитируемый пост)
я про id и писал

id трогать нельзя, это святое. на id могут fk смотреть(на то он и id), тогда их местами поменять - жопа полная.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
RomanEEP
Дата 7.5.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Цитата(Zloxa @  7.5.2009,  17:09 Найти цитируемый пост)
id трогать нельзя, это святое. на id могут fk смотреть(на то он и id), тогда их местами поменять - жопа полная.
 
честно говоря, в моем случае можно, у меня на id ничего не ссылается, это PK, который я создал только для удобства редактирования таблицы, чтобы не создават естественный ключ по 2 другим полям
PM MAIL   Вверх
Deniz
Дата 8.5.2009, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



RomanEEP, а в чем проблема то?
В дополнение к предположению о добавлении поля Order.
Допустим у нас "дырок" в поле Order нет, т.е. все номера по порядку.
Представь что это обычный массив, и тебе нужно поменять 4 и 10 строку местами.
1. Order №4 во временную переменную
2. Order №4 = Order #10
3. Order №10 = временная переменная

Если нужно запись с Order = 4 поставить на место между 100 и 101, то
1. Берем id записи с Order=4
2. update table set order = order-1 where order between 5 and 100
3. update table set order = 100 where id = <Id для Order4>
Если записей много и перенос "дальний", то пункт 2 может занять много времени.
Аналогично для переноса 100 в 4
1. ...
2. update table set order = order+1 where order between 4 and 99
3. ...


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
RomanEEP
Дата 8.5.2009, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Deniz, 

Пусть будет таблица
ID Name Order
6    Path1  1
8    Path2  2
9    Path3  3
16  Pathz  4
18  Pathe  5
29  Pathq  6
36  Pathw 7
48  Pathe  8
49  Pathr   9

Как мне поставить первую строчку между строками 5 и 6?
PM MAIL   Вверх
Deniz
Дата 8.5.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



RomanEEP, смотри алгоритм выше.
Код

x = 1 - что перемещаем
y = 5 - куда перемещаем
v = ID(x) = 6
update table set order = order-1 where order between x+1 and y
update table set order = y where id = v
как-то так


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
DimW
Дата 8.5.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 2
Всего: 44



Цитата(RomanEEP @  8.5.2009,  08:18 Найти цитируемый пост)
Как мне поставить первую строчку между строками 5 и 6? 

чем такой ваиант не устроил?
Код

create table test_order
(id number
,name varchar2(20)
,ord number)
/
 
insert into test_order values (10,'Path1',1);
insert into test_order values (20,'Path2',2);
insert into test_order values (30,'Path3',3);
insert into test_order values (40,'Path4',4);
insert into test_order values (50,'Path5',5);
insert into test_order values (60,'Path5',6);
insert into test_order values (70,'Path5',7);

select * from test_order order by ord;
 
        ID NAME                        ORD
---------- -------------------- ----------
        10 Path1                         1
        20 Path2                         2
        30 Path3                         3
        40 Path4                         4
        50 Path5                         5
        60 Path5                         6
        70 Path5                         7
 
7 rows selected

update test_order
   set ord = (select avg(t.ord)
                from test_order t
               where t.id in (50, 60))
 where id = 10;
 
1 row updated

select * from test_order order by ord;
 
        ID NAME                        ORD
---------- -------------------- ----------
        20 Path2                         2
        30 Path3                         3
        40 Path4                         4
        50 Path5                         5
        10 Path1                       5,5
        60 Path5                         6
        70 Path5                         7


Это сообщение отредактировал(а) DimW - 8.5.2009, 09:10
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.