2016-03-17 2 views

ответ

1

Что вы делаете неправильно, назначая переменные в одном выражении и используя значения в другом. MySQL не гарантирует порядок оценки выражений в select, поэтому это небезопасно.

Это объясняется в documentation:

Как правило, другой, чем в SET заявлении, вы никогда не должны присвоить значение переменной пользователя и прочитать значение в том же заявления. Например, для увеличения переменной, это нормально:

SET @a = @a + 1; 

Для других заявлений, таких как SELECT, вы можете получить результаты, которые вы ожидаете, , но это не гарантируется. В следующем заявлении, вы можете подумать, что MySQL будет оценивать @a первый, а затем сделать задание второй:

SELECT @a, @a:[email protected]+1, ...; 

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

0

Вот что вы делаете:

SELECT 
@frst:= (1) // *1 
+ 
@scnd:= (2) as 'Total',// *2 
@frst as 'Frst',// *3 
@scnd as 'Scnd'// *4 

, как:

*1 & *2 => set @frst to 1, set @scnd to 2,add and assign to @frst return as total which is 3 (1 + 2) 
*3 => @frst as 'Frst' // return 3 as Frst 
*4 => @scnd as 'Scnd' // return 2 as Scnd 

и ваш запрос возвращает total, равный 3, Frst, равный 3 и Scnd который равным 2 Надеюсь, вы все исправите.

Смежные вопросы