|
|
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
В селекте использую переменные, авторSELECT .... @var1 := table.fieldA + table.fieldB AS result1 @var2 := table.fieldC + @var1 AS result2 FROM ... В результате наблюдаю такие вещи. а) при первом выполнении колонка result2 = NULL для всех полей; б) result2 одинаковый для всех записей в выдаче; если при вычислении использовать имена полей, а не переменную var1, то значения правильные. Подскажите, товарищи спецы, почему так получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 15:11:04 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
usermuser, а проинитить переменную значением, не? :) set @var1 = 0 А иначе она null и все, что к null прибавляется - им же и становится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 15:16:41 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
если, инициализацию ставлю перед селектом то в результате во всей колонке одни нули. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 15:29:12 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
usermuser, Покажите воспроизводимый код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 15:31:54 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
авторSET @total = 0; SET @totalA := 0; SET @totalB := 0; SELECT r.id , @total := SUM(CEIL((CASE WHEN s.seasonTo < 1414785600 THEN s.seasonTo ELSE 1414785600 END - CASE WHEN s.seasonFrom > 1414699200 THEN s.seasonFrom ELSE 1414699200 END )/86400)) AS total , @totalA := @total*rate.rateA AS totalA , @totalB := @total*rate.rateB AS totalB , @totalA + @totalB AS totalC FROM services r LEFT JOIN seasons s ON CASE WHEN s.seasonFrom > 1414699200 THEN s.seasonFrom ELSE 1414699200 END < CASE WHEN s.seasonTo < 1414785600 THEN s.seasonTo ELSE 1414785600 END LEFT JOIN rates rate ON (rate.roomID = r.roomID AND rate.seasonID = s.seasonID) GROUP BY id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 15:59:02 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
при инициализации переменных, totalC всё время равно 0. Такое ощущение, что переменная обнуляется в самом запросе, но это же не так ведь? Чем вызвано такое поведение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 16:18:19 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
usermuser, а как именно вы этот код запускаете? в консоли mysql пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 16:53:06 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
miksoftusermuser, а как именно вы этот код запускаете? в консоли mysql пробовали? usermuser, да, это тут важно. переменная задается на сессию конекта. Во многих фреимворках используется конекш-пул. Т.е очень возможна ситуация когда SET @a.... прошло на одном конекте а следуюшая строка послана через другой конект и переменная "потерялась" Что бы этого избежать надо или делать все одной падачей (если драйвер понимает несколько команд кучей) или задавайте переменную на лету: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 17:41:43 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
javajdbcmiksoftusermuser, а как именно вы этот код запускаете? в консоли mysql пробовали? да, это тут важно. или задавайте переменную на лету: спасибо за помощь. код запускаю в клиенте HeidiSQL. А как правильно сформировать запрос в моём случае с инициализацией переменных на лету? С подобным синтаксисом не сталкивался, пример не уяснил. Буду признателен, если подскажите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 18:50:34 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Ещё я тут вычитал, что работать с переменными вообще опасно, может вернуться непредсказуемый результат. Насколько оправданы подобные опасения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 18:51:35 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
usermuserjavajdbcпропущено... да, это тут важно. или задавайте переменную на лету: спасибо за помощь. код запускаю в клиенте HeidiSQL. А как правильно сформировать запрос в моём случае с инициализацией переменных на лету? С подобным синтаксисом не сталкивался, пример не уяснил. Буду признателен, если подскажите. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. (для читабельности, не называйте одинаково алиасы и переменные: @totalA <-> totalA) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 19:21:13 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
usermuserЕщё я тут вычитал, что работать с переменными вообще опасно, может вернуться непредсказуемый результат. Насколько оправданы подобные опасения? да, частенько бывают непонятки. например, вот прямо в вашем примере, я не берусь судить что будет так как вы хотите -- у вас ГРОУП БУ . Надежнее сделать селект с групбаем без переменных как подзапрос и его окружить еше одним селектом где и вычисляйте производные суммы -- если сможете -- все БЕЗ переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 19:26:46 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
javajdbcFROM (select @total:=0, @totalA:=0,@totalB:=0) z JOIN services r В таком варианте все колонки по нулям. Как будто в цикле обнуляются переменные и ничего не сохраняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 21:18:54 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
javajdbcНадежнее сделать селект с групбаем без переменных как подзапрос и его окружить еше одним селектом где и вычисляйте производные суммы -- если сможете -- все БЕЗ переменных. Это пока сложно для моего понимания. На данный момент нормально работающий вариант без переменных, это тупо заменить сами переменные аналогичным кодом. Коряво, да, зато работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 21:20:30 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
usermuserjavajdbcFROM (select @total:=0, @totalA:=0,@totalB:=0) z JOIN services r В таком варианте все колонки по нулям. Как будто в цикле обнуляются переменные и ничего не сохраняется. Скорее всего GROUP BY сбивает расчеты в SELECT блоке. Если получается по логике, сделайте селект-подселект без переменных: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 21:24:17 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
GROUP BY забыл Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 21:25:20 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
дык сдесь сразу понятно было...сначала пройдёт обработка переменных в полях, которые не связаны с агрегацией, а потом поля с агрегацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2014, 15:43:31 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
alex564657498765453дык сдесь сразу понятно было...сначала пройдёт обработка переменных в полях, которые не связаны с агрегацией, а потом поля с агрегацией. Вах маладец! Спасибо, да, дарагой, приходи чаще, рады будем, приходи и сразу говори как надо. Реально поможеш -- братаны не будут головы ломать. Пиво будем кушать, кальмаров кушать, красивых девочек танцеват. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 00:00:10 |
|
||
|
переменные, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
javajdbcalex564657498765453дык сдесь сразу понятно было...сначала пройдёт обработка переменных в полях, которые не связаны с агрегацией, а потом поля с агрегацией. Вах маладец! Спасибо, да, дарагой, приходи чаще, рады будем, приходи и сразу говори как надо. Реально поможеш -- братаны не будут головы ломать. Пиво будем кушать, кальмаров кушать, красивых девочек танцеват. всегда пожалуста...могу больше сказать. для начала, я уже понял что я не понятно выразился...реплика была для варианта с переменными твоего логика обработки выделана группа, для каждого вычисляемого поля без агрегации пройдёт вычисление но только в рамках группы, потом пощитаеться агрегированное значение для этой группы. в итоге получиться, что для вычисления не агрегированых значений, будет использоваться не сумма для текущей группы, а сумма вычисленная для предыдущей. пример(первый) Код: sql 1. 2. 3. 4. 5. 6. 7. первый запрос выдаст результат на подобе этого 1 10 1 1 20 11 1 123 21 1 4 124 1 0 5 тоесть вычисление третьего значения, проиходит использую сумму предыдущей группы а вот другой вопрос, будет выполняться по другому. ведь мы явно указали третий столбик для групировки, тоесть не вычислив его, мы впринципе не может начать групировать записи. тут получиться на подобе того что автор сначала делал. для вычисления его, будет использована последняя сумма предыдущего запроса - получиться константа для всех записей второго запроса. ЗЫ Если рассуждать более строго (мускл и насколько я понимаю отсальные субд тоже) то запись select id,@t:=id+1,@tt:=@t+1 не следует ожидать что для айди = 1 мы получим 1 2 3 это как со значением переменой цикла фор после самого цикла, она всегда равна макс значение щётчика плюс один, но везде говорят, что не надо на это ращитывать, ибо хз как завтра может измениться компилятор/интерпритатор... данный момент не стандартизирован - пока что так. так вот порядок обработки столбцов тоже не специфицирован, более того - реляционная модель как раз таки подразумевает, что от порядка столбцов ничего не зависит. ращитывать что пулучим 1 2 3 , тоже что ращитывать при select * from table получим записи отсортированые по примари кею автоинкрементному. таки да, получим - в большинстве случаев, но в меньшинстве изза работы оптимизатора это не так. с переменными пока что оптимизатора можно сказать нету, но завтра он может появиться. и таки последовательность обработки полей может отличаться от перечисленой. селект указывает лишь порядок вывода, но не порядок обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 12:10:28 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38710339&tid=1834409]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
62ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 337ms |

| 0 / 0 |
