SELECT
@frst:= (1)
+
@scnd:= (2) as 'Total',
@frst as 'Frst',
@scndas 'Scnd'
Этот запрос возвращает 3 - 3 - 2, а не 3 - 1 - 2. Что я делаю неправильно?SQL Выберите сумму запроса переменной
SELECT
@frst:= (1)
+
@scnd:= (2) as 'Total',
@frst as 'Frst',
@scndas 'Scnd'
Этот запрос возвращает 3 - 3 - 2, а не 3 - 1 - 2. Что я делаю неправильно?SQL Выберите сумму запроса переменной
Что вы делаете неправильно, назначая переменные в одном выражении и используя значения в другом. MySQL не гарантирует порядок оценки выражений в select
, поэтому это небезопасно.
Это объясняется в documentation:
Как правило, другой, чем в
SET
заявлении, вы никогда не должны присвоить значение переменной пользователя и прочитать значение в том же заявления. Например, для увеличения переменной, это нормально:SET @a = @a + 1;
Для других заявлений, таких как
SELECT
, вы можете получить результаты, которые вы ожидаете, , но это не гарантируется. В следующем заявлении, вы можете подумать, что MySQL будет оценивать @a первый, а затем сделать задание второй:SELECT @a, @a:[email protected]+1, ...;
Однако, порядок вычисления выражений, включающих пользовательские переменные не определено.
Вот что вы делаете:
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 Надеюсь, вы все исправите.
Существует много вариантов SQL; вы должны указать версию, которую используете. – AJNeufeld