Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли сделать такой интерестный select?


SergP ©   (2004-04-09 21:53:00) 

БД MySQL
В таблице имеется поле типа memo
Можно ли сделать запрос, чтобы в результате получить набор записей c таким кол-вом записей чтобы сумма длин (length) выбранных записей этого поля была максимальной, но не превышала определенного значения?

если да, то как?


Nikolay M.   (2004-04-12 09:43:00) [1]


> Делаю запрос на N записей (LIMIT N), затем перебирая полученые
> записи закидываю все в переменную пока либо не не пройду
> все записи, либо длина переменной не превысит допустимую.
> Если после прохождения всех записей длина переменной не
> достигла нужного значения, то делаю новый аналогичный запрос,
> но уже таким образом чтобы выбирались следующие записи и
> т.д.
>
> Есть вариант такой: сделать один запрос но с заведомо большим
> числом N и пройтись по ним пока они не закончатся или пока
> длинна переменной не достигнет установленого максимума,
> после чего на этом и остановится.
>
> Какой вариант лучше в плане уменьшения нагрузки на сервер?

Ну, понимаешь, статистику по данным в этом поле надо поднять и найти оптимальные N для обоих вариантов, а потом уже и смотреть. По сетке данные у тебя, скорее всего не гоняются (если веб-сервер = сервер MySQL). Я бы особо не мудрил, оставил первый вариант, только с параметром N все-таки поигрался бы: собрать разные типы запросов к серверу, выполнить их и подсчитать средневзвес N получаемых сумм нужного поля. Его и можно брать как LIMIT N.


SergP   (2004-04-11 17:10:00) [2]

ну я понял что нельзя сделать так как я хочу. Но вот как поступить лучше?
Хочу сделать ограничение допустим приблизительно в 200Кб. (особая точность не требуется, погрешность в несколько Kб особой роли играть не будет)
Вобщем мне нужно из таких записей "засунуть" данные в переменную, но так как содержимое мемо полей может у разных записей быть очень разным (от нескольких байт, до нескольких десятков Кб), нужно ограничить ее размер.
Пока вижу такие варианты:
Делаю запрос на N записей (LIMIT N), затем перебирая полученые записи закидываю все в переменную пока либо не не пройду все записи, либо длина переменной не превысит допустимую. Если после прохождения всех записей длина переменной не достигла нужного значения, то делаю новый аналогичный запрос, но уже таким образом чтобы выбирались следующие записи и т.д.

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

Какой вариант лучше в плане уменьшения нагрузки на сервер? (кстати это серверная часть проги и пишу я ее на PHP, извиняюсь конечно что это не совсем имеет отношение к Delphi)


RayRom   (2004-04-11 16:45:00) [3]

Да подзапросы только в версии 4.1.х будут а в версиях 4.0.х (с 4.0.17 работаю) только union добавили.
Единственно ты можеш сделать ограничение на единоразовую передачу пакета данных с сервера указав в опциях сервера.

У мя проблема вознила когда я стал фотографии размером в 2М кидать в поля Мемо, ну сервак ругается, пришлось в инфу лесть, ну и оказалась что ограничения пакета на передачу на сервак был 1М пришлось увеличить до 8М.
Правда немного не в тему ну может получится найдеш по твоему вопросу.


Nikolay M.   (2004-04-11 13:07:00) [4]


> SergP ©   (11.04.04 01:21) [5]
> Допустим есть 2 поля: id и text (text - типа  memo)
> Нужно сделать так:
> select id, text from table order by id

Для СУБД, поддерживающих подзапросы, делается элементарно: к этому запросу добавляется условие
HAVING some_limit < (SELECT sum(length(text)) FROM table AS table_2 WHERE table_2.id <= table.id)
но в мускуле, повторюсь, такое невозможно. По крайней мере, на тех версиях, на которых работал я. Поскольку я от него уже отошел, возможно, уже вышла какая-нибудь 5-я версия, в которой подзапросы поддерживаются.


SergP   (2004-04-11 01:21:00) [5]

2 RayRom ©   (10.04.04 21:41)

и как это сделать? Может приведешь пример?

Допустим есть 2 поля: id и text (text - типа  memo)
Нужно сделать так:
select id, text from table order by id (далее нечто похожее на LIMIT, только LIMIT выбирает определенное (указанное) число записей, а мне нужно такое чтобы как только общая сумма length(text) по выбранным записям превысит нужное значение, чтобы выбирание записей на этом закончилось)


RayRom   (2004-04-10 21:41:00) [6]

Nikolay M. ©   (09.04.04 23:28) [3]

> Слишком уж там SQL покоцаный

Любой язык портит навороченнность
Я работаю, накаких проблем, а для вывода мона использвать
функцию определения длины в условии запроса если длинна значения больше определенного то выводить к примеру строку "слишком много мусора" или т.п.


Nikolay M.   (2004-04-09 23:28:00) [7]

Тоже нет. Во всяком случае не в мускуле. Слишком уж там SQL покоцаный.
В аксессе, MS SQL - думаю, что реально. По крайней мере в голове вроде складывается. Но в MySQL забудь делать такие вещи одним запросом.


SergP   (2004-04-09 23:15:00) [8]

Пардон, неправильно сформулировал вопрос.
имеется ввиду не совсем задача оптимизации.
Т.е. имелось ввиду не оптимизация, а некоторое подобие LIMIT'а, типа выбираются записи пока суммарная длина записей заданного поля не превысит допустимую.


Nikolay M.   (2004-04-09 22:56:00) [9]

Нельзя. Придется решать задачу оптимизации, так же известной как задача о рюкзаке.


Наверх

Титульная страница Поиск, карта сайта Написать письмо