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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как выполнить сортировку по полю ID_TABLE? FB 2.0 
V
    Опции темы
tishaishii
Дата 19.2.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Смысл: в программу попадает набор ключей TABLE1.ID_TABLE в определённом порядке.
Динамически составляю запрос типа:
Код
SELECT * FROM TABLE1 WHERE ID_TABLE IN (?, ..., ?)

и выполяю его с полученным и определённым способом упорядоченных ключей в качестве аргументов.
Например, набор ключей ID_TABLE: 2, 10, 1, 1001, 32.

Получаю набор записей с соответствующими ключами. Только порядок записей не соблюдён (по набору ключей), т.е. получаю записи вроде: 1001, 32, 2, 10, 1.

Как отсортировать-то?
PM MAIL ICQ Skype   Вверх
ksili
Дата 19.2.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



может добавить ORDER BY ID_TABLE в конце?
или сортировать уже когда запрос динамически составляете?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
tishaishii
Дата 20.2.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Ты не о том. Если я передаю в IN(...) параметры в порядке (2, 10, 1, 13), то и соответствующие найденные записи должны быть упорядочены в том же порядке, т.е. я получу записи с ключами (2, 10, 1, 13) именно в том порядке, как перечислены аргументы.

Код
SELECT * FROM TABLE1 WHERE ID_TABLE IN (2, 10, 1, 13)

Вывод:

ID_TABLE1         TITLE
 2                ksladfskl
10                ksladfskl
 1                ksladfskl
13                ksladfskl

PM MAIL ICQ Skype   Вверх
Deniz
Дата 20.2.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Можно извратиться через доп. таблицу
id, order_field
2 - 1
10 - 2
1 - 3
13 - 4
Добавляй в эту таблицу свои значения, а потом join с нужной таблицей и order by order_field, если пользователей > 1 тогда добавить поле id_session или что-то типа того для идентификации выборки и параметров.


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


Создатель
***


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

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



Понял. Спасибо, вариант подходящий.
PM MAIL ICQ Skype   Вверх
Deniz
Дата 21.2.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Причем на Order_Field можно поставить генератор, и забыть


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


Новичок



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

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



не надо усложнять себе жизнь (с доп. таблицами) 
просто преобразовывайте с помощью CASE значения ID_TABLE в нужный порядок сортировки и сортируйте по нему.

пример:

Код

where ID_TABLE in (2, 10, 1, 13)
order by 
        case ID_TABLE
           when 2   then 1
           when 10 then 2
           when 1   then 3
           when 13 then 4
         end

PM MAIL   Вверх
Deniz
Дата 22.2.2008, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



kZ25, как раз твой способ и есть усложнение жизни.
Плюсы:
1. Нет доп. таблиц.
Минусы:
1. select строится динамически на клиенте - оптимизатор каждый раз его разбирает, это доп. работа.
2. использование индексов по такому order by под большим вопросом, а это доп. нагрузка.
3. если таких параметров ID_TABLE in(2, 10, 1, 13, ...) будет много, то select превратится в достаточно длинную строку, что доп. нагрузит оптимизатор.
А теперь сравним с доп. таблицами:
Код
select * from Table1 join Order_Table on ID_Table = ID where (IDSession = ...) order by Order_Field

Плюсы:
1. select уже подготовленный и есть план запроса.
2. связь с Order_Table(небольшое кол-во записей) по индексному полю (ID), т.е. использование индексов и в Table1 и в Order_Table
3. Кол-во параметров не ограничено, т.е. их может быть и тысячи.
Минусы:
1. Доп. время на добавление в таблицу Order_Table(удаление можно запускать периодически каждый час/день/ и т.д.).

PS: каждый для себя сам решит что для него лучше.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

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

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


 




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


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

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