Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.08.20;
Скачать: [xml.tar.bz2];

Вниз

"Вложенные" вычисления в запросе   Найти похожие ветки 

 
Дмитрий   (2015-03-27 17:13) [0]

Здравствуйте

Для отчетов строю запросы к 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 ...

Приходится городить запросы к запросам или загромождать повторными вычислениями один запрос.

При необходимости внести изменения получается ужас.
Как делать правильно?


 
KilkennyCat ©   (2015-03-27 20:15) [1]


> Как делать правильно?

смотря как нужно. может, нельзя нагружать сервер, а может можно...
ну а вообще, если возникает запутанность, то надо делать как удобней, чтоб как раз не в падать в ужас при изменениях, т.е. разбивать, оптимизировать, дефайны вводить вовсю.
ну и http://www.zoonman.ru/library/mysql_sr_and_t.htm


 
Дмитрий   (2015-03-27 20:25) [2]

Mожно ли каким-то образом задать значение какого-либо поля и тут же его использовать

Select ID, 1+1 as K, (K - 1)/(K+1) as K2, ...
From T

В основном, система ругается на неопознаное поле либо амбигос.
И ладно бы всегда, в некоторых случаях прокатывает.

Мне с очередной сменой формулы приходится переносить пирамиду вычисляемых полей на слой глубже.


 
Дмитрий   (2015-03-27 20:29) [3]

Попробую вынести функцию


 
кгшзх ©   (2015-03-28 09:42) [4]

select * from (
select ID, 1+1 as K, (K - 1)/(K+1) as K2, ...
from T
)


 
Кщд ©   (2015-03-28 17:27) [5]

>Дмитрий   (27.03.15 20:25) [2]
>Мне с очередной сменой формулы приходится переносить пирамиду вычисляемых полей >на слой глубже.
считать на клиенте
либо смириться с грудой нечитаемого кода (та самая Ваша "пирамида")


 
Дмитрий   (2015-03-30 17:39) [6]

Какой вариант  запросов будет выполняться быстрее
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-31 06:17) [7]

>Дмитрий   (30.03.15 17:39) [6]
Вы не способны оценить план запроса и написать простейший скрипт, оценивающий скорость выполнения?


 
Дмитрий   (2015-03-31 21:26) [8]

Очень надеялся с вашей помощью избежать выполнения двойной работы
по написанию обоих вариантов запросов
Тем более что их надо до...


 
KilkennyCat ©   (2015-04-01 12:32) [9]

я тоже хочу избежать двойной работы, давай часть моей рутинной, однообразной,
неинтересной и экспериментальной, а потому с неизвестным результатом, работы ты сделаешь?

> простейший скрипт, оценивающий скорость выполнения?

причем, встроен вроде в майскьюл


 
Дмитрий   (2015-04-01 17:01) [10]

не знаете, так бы и сказали


 
KilkennyCat ©   (2015-04-01 22:44) [11]

Не знаю.


 
Германн ©   (2015-04-02 02:47) [12]


> Дмитрий   (01.04.15 17:01) [10]
>
> не знаете, так бы и сказали
>

На "слабо" пытался развести?


 
Дмитрий   (2015-04-02 18:30) [13]

Причем тут "слабо".
Вы разве нашли у меня реальные запросы для сравнения?
Или конкретную реализацию функции?

Вопрос был по внутреннему механизму mySQL.
Будет ли в случае б) вызываться функция повторно, или же значение будет сохранено и использовано без повторного расчета


 
Inovet ©   (2015-04-02 20:11) [14]

> [13] Дмитрий   (02.04.15 18:30)
> без повторного расчета

Ну так тебе и предложили попробовать и проверить. Делов на 1 минуту. Думается, будет там какой-нибудь
Column not found
нет же поля K.


 
KilkennyCat ©   (2015-04-02 22:33) [15]


> Вы разве нашли у меня реальные запросы для сравнения?
> Или конкретную реализацию функции?

вот именно, что нет. потому что на

> Вопрос был по внутреннему механизму mySQL.
> Будет ли в случае б) вызываться функция повторно, или же
> значение будет сохранено и использовано без повторного расчета

можно ответить так: в некоторых случаях да, а в некоторых нет.


 
Inovet ©   (2015-04-03 14:55) [16]

А зачем придумали всякие пользовательские функции, в том числе и в SQL? Говорю заранее по требованию автора - не знаю, есть ли они в MySQL, как с ними бороться, и вообще ничего не знаю.


 
Германн ©   (2015-04-04 02:35) [17]


> Дмитрий   (02.04.15 18:30) [13]
>
> Причем тут "слабо".
> Вы разве нашли у меня реальные запросы для сравнения?

А разве что-то говорил о "реальных запросах для сравнения"?
Тебе предложили попробовать самому " оценить план запроса и написать простейший скрипт, оценивающий скорость выполнения".


 
Труп Васи Доброго ©   (2015-04-23 15:10) [18]

А SP не спасёт отца русской демократии? Или в mySQL нет SP?


 
имя   (2015-10-20 19:41) [19]

Удалено модератором



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

Форум: "Начинающим";
Текущий архив: 2017.08.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.001 c
3-1314343082
OW
2011-08-26 11:18
2017.08.20
Oracle.Функция в выборке и в условии - 2 раза будет вычисляться?


2-1425574229
SergP
2015-03-05 19:50
2017.08.20
TiniFile есть ли ограничение на размер ini - файла?


2-1427465606
Дмитрий
2015-03-27 17:13
2017.08.20
"Вложенные" вычисления в запросе


1-1352816586
cobalt
2012-11-13 18:23
2017.08.20
D7, XPManifest, TMemo и TPanel.Color


2-1427187807
TComboBox
2015-03-24 12:03
2017.08.20
ComboBox DroppedDown direction





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский