![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Вложенные" вычисления в запросе [D7, XP]
Дмитрий © (2015-03-27 17:13:00)Здравствуйте
Для отчетов строю запросы к mySQL
Много рассчитываемых полей.
Пример,
... Дата1 - ifnull(Дата2, Дата3) as ДлитРасч1...
... Дата4 + ДлитРасч1 as ДатаРасч1 ...
... Дата5 - ДатаРасч1 as ДлитРасч2 ...
Пытался использовать переменные, не получилось, такое использование оказалось не предусмотрено.
... @ДлитРасч1 :=Дата1 - ifnull(Дата2, Дата3) as ДатаРасч1,
Дата4 + @ДлитРасч1 as ДатаРасч1 ...
Приходится городить запросы к запросам или загромождать повторными вычислениями один запрос.
При необходимости внести изменения получается ужас.
Как делать правильно?
(2015-10-20 19:41:00) [1]Удалено модератором
Труп Васи Доброго (2015-04-23 15:10:00) [2]А SP не спасёт отца русской демократии? Или в mySQL нет SP?
Германн (2015-04-04 02:35:00) [3]
> Дмитрий (02.04.15 18:30) [13]
>
> Причем тут "слабо".
> Вы разве нашли у меня реальные запросы для сравнения?
А разве что-то говорил о "реальных запросах для сравнения"?
Тебе предложили попробовать самому " оценить план запроса и написать простейший скрипт, оценивающий скорость выполнения".
Inovet (2015-04-03 14:55:00) [4]А зачем придумали всякие пользовательские функции, в том числе и в SQL? Говорю заранее по требованию автора - не знаю, есть ли они в MySQL, как с ними бороться, и вообще ничего не знаю.
KilkennyCat (2015-04-02 22:33:00) [5]
> Вы разве нашли у меня реальные запросы для сравнения?
> Или конкретную реализацию функции?
вот именно, что нет. потому что на
> Вопрос был по внутреннему механизму mySQL.
> Будет ли в случае б) вызываться функция повторно, или же
> значение будет сохранено и использовано без повторного расчета
можно ответить так: в некоторых случаях да, а в некоторых нет.
Inovet (2015-04-02 20:11:00) [6]> [13] Дмитрий (02.04.15 18:30)
> без повторного расчета
Ну так тебе и предложили попробовать и проверить. Делов на 1 минуту. Думается, будет там какой-нибудь
Column not found
нет же поля K.
Дмитрий (2015-04-02 18:30:00) [7]Причем тут "слабо".
Вы разве нашли у меня реальные запросы для сравнения?
Или конкретную реализацию функции?
Вопрос был по внутреннему механизму mySQL.
Будет ли в случае б) вызываться функция повторно, или же значение будет сохранено и использовано без повторного расчета
Германн (2015-04-02 02:47:00) [8]
> Дмитрий (01.04.15 17:01) [10]
>
> не знаете, так бы и сказали
>
На "слабо" пытался развести?
KilkennyCat (2015-04-01 22:44:00) [9]Не знаю.
Дмитрий (2015-04-01 17:01:00) [10]не знаете, так бы и сказали
KilkennyCat (2015-04-01 12:32:00) [11]я тоже хочу избежать двойной работы, давай часть моей рутинной, однообразной,
неинтересной и экспериментальной, а потому с неизвестным результатом, работы ты сделаешь?
> простейший скрипт, оценивающий скорость выполнения?
причем, встроен вроде в майскьюл
Дмитрий (2015-03-31 21:26:00) [12]Очень надеялся с вашей помощью избежать выполнения двойной работы
по написанию обоих вариантов запросов
Тем более что их надо до...
Кщд (2015-03-31 06:17:00) [13]>Дмитрий (30.03.15 17:39) [6]
Вы не способны оценить план запроса и написать простейший скрипт, оценивающий скорость выполнения?
Дмитрий (2015-03-30 17:39:00) [14]Какой вариант запросов будет выполняться быстрее
f(field1,field2) - условная хранимая функция
операции с функцией тоже условны, как пример многократного обращения к расчетному значению в одном выражении
а) select ..., (f(field1,field2) - field3)/(f(field1,field2) - field3) ,... from t
или
б) с двухуровневым запросом/вьюхой
... view as q
select id, f(field1,field2) as FF from t
//---------------------------
select id, q.FF , (FF - field3)/(FF + field3)
from t
join q on q.id=t.id
Кщд (2015-03-28 17:27:00) [15]>Дмитрий (27.03.15 20:25) [2]
>Мне с очередной сменой формулы приходится переносить пирамиду вычисляемых полей >на слой глубже.
считать на клиенте
либо смириться с грудой нечитаемого кода (та самая Ваша "пирамида")
кгшзх (2015-03-28 09:42:00) [16]select * from (
select ID, 1+1 as K, (K - 1)/(K+1) as K2, ...
from T
)
Дмитрий (2015-03-27 20:29:00) [17]Попробую вынести функцию
Дмитрий (2015-03-27 20:25:00) [18]Mожно ли каким-то образом задать значение какого-либо поля и тут же его использовать
Select ID, 1+1 as K, (K - 1)/(K+1) as K2, ...
From T
В основном, система ругается на неопознаное поле либо амбигос.
И ладно бы всегда, в некоторых случаях прокатывает.
Мне с очередной сменой формулы приходится переносить пирамиду вычисляемых полей на слой глубже.
KilkennyCat (2015-03-27 20:15:00) [19]
> Как делать правильно?
смотря как нужно. может, нельзя нагружать сервер, а может можно...
ну а вообще, если возникает запутанность, то надо делать как удобней, чтоб как раз не в падать в ужас при изменениях, т.е. разбивать, оптимизировать, дефайны вводить вовсю.
ну и http://www.zoonman.ru/library/mysql_sr_and_t.htm