Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

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

 
SergP ©   (2004-04-09 21:53) [0]

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

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


 
Nikolay M. ©   (2004-04-09 22:56) [1]

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


 
SergP ©   (2004-04-09 23:15) [2]

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


 
Nikolay M. ©   (2004-04-09 23:28) [3]

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


 
RayRom ©   (2004-04-10 21:41) [4]

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

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

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


 
SergP ©   (2004-04-11 01:21) [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) по выбранным записям превысит нужное значение, чтобы выбирание записей на этом закончилось)


 
Nikolay M. ©   (2004-04-11 13:07) [6]


> 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-я версия, в которой подзапросы поддерживаются.


 
RayRom ©   (2004-04-11 16:45) [7]

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

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


 
SergP ©   (2004-04-11 17:10) [8]

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

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

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


 
Nikolay M. ©   (2004-04-12 09:43) [9]


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.036 c
4-1075628697
Phantomaz
2004-02-01 12:44
2004.04.11
Как зашить рисунок в файл ресурса ?


1-1082476978
jiuraf
2004-04-20 20:02
2004.04.11
Как скопироватьсодержимое RichEdit1 В RichEdit2?


14-1079549730
Alikm
2004-03-17 21:55
2004.04.11
Помогите с ответом!


3-1081004186
RayRom
2004-04-03 18:56
2004.04.11
’’ is not a valid integer value


6-1075972007
Aleksey093
2004-02-05 12:06
2004.04.11
Подскажите пожалуйста про IdDNSResolver