Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2015, 13:02   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Данные о сортировке таблицы.

Общий привет.
Сразу, наверное, предупрежу, что сам до конца не понимаю задание, поэтому если будет сумбур - сильно не пинайте.
Короче говоря есть некая табличка:

[too]
ID ФИО Дата
1 Я 01.01.2015
2 Ты 02.01.2015
3 Он 06.01.2015
[/too]

Эта табличка выдается на экран. Пользователь жмакает по заглавиям колонок, чтоб их сортировать. Все вроде ничего, но задали мне ответственные люди вопрос: "Вот, мол, не нравится нам БД каждый раз дергать, а сортировать мы хотим часто. Можно ли к этой табличке прилепить колонки, которые бы указывали в каком порядке отображать полезные данные?"
Т.е. хотят получить такую таблицу:
[too]
ID ФИО Дата SortID SortFio SortDate
1 Я 01.01.2015 1 3 1
20 Ты 02.01.2015 3 2 2
3 Он 06.01.2015 2 1 3
[/too]
Чтоб мы показывали только первые три колонки, а при попытке сортировки мы вот хотим прочитать скажем SortID, в котором будет номер строки по порядку из изначального запроса, которую нужно вывести на экран.
Во как...
Причем оч. хотят чтоб это все было обставлено через SQL, поскольку с набором планирует работать совершенно другое подразделение, а они инстанцией выше, и их проггеры типо мегаспецы по оптимизации, отсюда и дали задание так данные им выкатывать.

короче говоря: прилепить к набору табличку индексов, чтоб работать с индексацией по месту не трогая сервер.

Вот как такое проделать в SQL одним запросом?
Причем условие: Никаких ХП. мотивируют мол база не наша, портить не будем.
I'm learning to live...

Последний раз редактировалось Stilet; 27.11.2015 в 13:04.
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 13:27   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
короче говоря: прилепить к набору табличку индексов, чтоб работать с индексацией по месту не трогая сервер.
Тут это ключевое понятие. Прилепить КУДА именно?

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

Т.е. Если есть клиент, то на нём можно переписать запросы, добавив ORDER BY НужныйСтолбец, имена столбцов брать извне.

Если же речь идёт просто о БД, к которой делают запросы через некую СУБД, то ничего не выйдет. Она про ваши хотелки ничего не знает и знать не будет.

Через вьёшки, имхо, можно было решить. Но вьюхи должны в БД храниться.
что запрещено условиями задачи.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2015, 13:36   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну вот сортировка по коду и прицепляю номер записи для сортировки по наименованию (при условии что Namep уникально!). Будет медленно для длинной таблицы. Есть еще ROW_NUMBER(), но проверить не могу - устарела моя СУБД
Код:
SELECT S.Kod,S.Namep,
    (SELECT COUNT(*) FROM SprLong S1 WHERE S1.Namep<=S.Namep)
  FROM SprLong S
  ORDER BY S.Kod
А использовать ClientDataSet и там индексов наплодить не?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2015, 13:40   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. нечто вроде такого ????
Код:
select id, fio, date
  ( select count(*) from <....> as sort1 where <....> and sort1.id<bases.id ) as sort1
  ( select count(*) from <....> as sort2 where <....> and sort2.fio<bases.fio ) as sort2
  ( select count(*) from <....> as sort3 where <....> and sort3.date<bases.date) as sort3
  from <....>
  where <....>
<....> все N раз должен быть один и тот же запрос и условие.

А как они хотят ПЕРЕКЛЮЧАТЬ у СЕБЯ сортировки НЕ ПЕРЕЗАПРАШИВАЯ сервер.(не меняя НАБОР ДАННЫХ)

Если клиент позволяет это делать (например DevExpress), то НЕЗАЧЕМ и городить доп. индексы (они ведь уже есть).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.11.2015 в 13:42.
evg_m вне форума Ответить с цитированием
Старый 27.11.2015, 13:44   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Прилепить КУДА именно?
К выходному набору данных.
Цитата:
на нём можно переписать запросы
Так в том то и дело, что тамошние какеры сказали мол "Мы будем утром получать запросом данные, целый день их гонять у себя, а к БД не обращаться".
Это они типа так решили проблему обрыва связи. "Маладцы" такие вот
Цитата:
Она про ваши хотелки ничего не знает и знать не будет.
Ну-у-у... Есть же функции recno() или типа таких, которые возвращают порядковый номер записи в выходном наборе, вот я и думаю, как-то можно их прилепить?
Или как-то получить данные самой индексации (MS SQL 2008 если что) по такому-то условию?
Цитата:
Есть еще ROW_NUMBER()
Только я не пойму как его прицепить к выходному набору? По ТЗ на каждое поле полезных данных нужен свой порядковый номер...
Цитата:
А использовать ClientDataSet и там индексов наплодить не?
Та х.з... Толком жеж сверху молчат. Ягнята молчат
Я им объяснял, что так не стоит делать, но верхам как правило побоку. Не сомневаюсь, что и им их верхи так же сказали "Делайте, и не спрашивайте зачем".
Цитата:
нечто вроде такого ?
Вот нечто типа.. Да.
Цитата:
А как они хотят ПЕРЕКЛЮЧАТЬ у СЕБЯ сортировки НЕ ПЕРЕЗАПРАШИВАЯ сервер.(не меняя НАБОР ДАННЫХ)
Говорят, что у них есть методика поскакивания по записям, согласно номеру в колонке, которая взята за ранжир для сортировки.
Мол "Мы эту технологию уже наработали в пилотном проекте". пЯлоты блин...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 13:57   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
ROW_NUMBER
Типа такого, теоретически
Код:
SELECT ROW_NUMBER() OVER(ORDER BY model) no, model FROM Product
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2015, 14:09   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Говорят, что у них есть методика поскакивания по записям, согласно номеру в колонке, которая взята за ранжир для сортировки
то бишь не сортировка (показ в нужном порядке) а ПЕРЕХОД на нужную запись в чистом виде Locate( current+1)
Код:
i:=1 (-1);
while i<count do if Locate(current+i) then break else Inc(i);
Цитата:
Есть еще ROW_NUMBER(), но проверить не могу - устарела моя СУБД
и кроме того не знаю не пробовал можно ли в ПОДЗАПРОСЕ использовать order by.
Код:
select id, fio, date, sort1.row, sort2.row, sort2.row
from <....> as basis
inner join ( select id, row_number() as row
                  from <....>
                order by id  ---СРАБОТАЕТ ЛИ ??? 
                where <....> ) as sort1 on sort1.id =basis.id

inner join ( select id, row_number() as row
                  from <....>
                order by fio  
                where <....> ) as sort2 on sort2.id =basis.id
....
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 27.11.2015, 14:43   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
то бишь не сортировка (показ в нужном порядке) а ПЕРЕХОД на нужную запись в чистом виде Locate( current+1)
Да нет. Именно перестройка отображения. Кликнули по заголовку колонки - таблица перестроилась согласно порядку колонки. Причем не хотят использовать алгоритмы сортировки "типо это не оптимально", а хотят мол сразу одним циклом поотображать записи. Я думаю у них, что-то типа такого написано:
Код:
With Dataset do begin
 first;
 while not eof do begin
  x:=GetBookmark;
  i:=FieldByName('SortFIO').AsInteger;
  first; moveby(i);
   for j:=0 to 3 do 
     Grid.Cells[...]:=Fields[j].AsXXX;
   GotoBookmark(x);
  next;
 end;
end;
В общем наверное какая-то такая ересь...
Иначе я просто не могу обьяснить зачем понадобился именно такой набор...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 14:58   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А тот ROW_NUMBER, что в #6 работает интересно? Полагаю, что для ордер бай там любые ключи можно и несколько ROW_NUMBER в одном запросе c разными ключами
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2015, 15:09   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Аватар
Вот пожалуй твой пример стоит мне покурить...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать данные из таблицы в БД cargo29 PHP 13 22.10.2012 12:57
Данные из таблицы в список, если в ячейке таблицы стоит количество oleg_sh Microsoft Office Excel 4 08.10.2012 14:52
Не отображаются данные таблицы panuta Общие вопросы Delphi 8 18.09.2011 12:31
Данные из двух полей исх. таблицы в одно поле сводной таблицы Strelec79 Microsoft Office Excel 2 02.08.2009 13:59
Данные из таблицы в поле EQ CaptainNemo Microsoft Office Word 10 15.06.2009 20:29